Android ImageView上的减法滤镜(从图像或视图对象中剪切出羽状椭圆)

Nax*_*cif 0 graphics user-interface android erase android-canvas

我正在试图弄清楚如何在ImageView中"切出一个羽毛孔".

原因是,我正在创建一个教程,我希望整个屏幕变暗.通过放置一个alpha值约为50%的黑色图像,这很容易做到.接下来我想在那个叠加层上切一个洞,这样你就可以更清楚地看到它下面的东西了.我们的目标是突出显示用户点击的按钮和内容,以便他们学习如何操作.

当我之前在ActionScript/Flash中执行此操作时,很容易在屏幕上放置一个暗淡的alpha,然后创建一个圆圈,缩放它的X和Y以匹配我想要突出显示的对象,然后使用它添加一个过滤器它的混合模式设置为SUBTRACT.这个减去圆/椭圆也可以被告知接受鼠标点击,并且这个孔很好用.

在android中,我似乎无法看到如何从视图中减去.我可以看到人们使用滤色器添加到视图或更改颜色.

所以,除非我错过了船,你怎么减去?

Ros*_*ack 7

您需要编写自定义Drawable类并将其分配给ImageView.那么你可以在draw方法中轻松完成这样的操作:

class MyDrawable extends Drawable {

    @Override
    public void draw(Canvas canvas) {
        Path path = new Path();
        path.setFillType(FillType.EVEN_ODD);

        // This will create a full screen rectangle.
        path.addRect(<screen size rect here>, Path.Direction.CW);

        // This will punch a hole in it
        path.addCircle(<x>, <y>, <radius>, Path.Direction.CCW);

        // Now draw everything on the Canvas
        Paint paint = new Paint();
        paint.setColor(<dim color here>);
        canvas.drawPath(path, paint);
    }
Run Code Online (Sandbox Code Playgroud)

为了使它在突出显示时工作得很好,你可以在这个Drawable的构造函数中传递你想要突出显示的视图.然后,您可以使用以下方法确定视图的位置:

int[] position = new int[2];
view.getLocationOnScreen(position);
Run Code Online (Sandbox Code Playgroud)

使用此选项以及视图的高度和宽度来确定圆的大小和位置.

我不知道这是否有效,但您也可以尝试通过这样做来完成切割:

paint.setMaskFilter(new BlurMaskFilter(20, BlurMaskFilter.Blur.NORMAL));
Run Code Online (Sandbox Code Playgroud)