1

现在,我拥有它,因此我的布局由一个Fragment占据整个屏幕并显示图像的布局组成。我想让它View在它上面存在一个附加的,也占据整个屏幕。在那个顶层,我希望能够将它最初全部着色为黑色,然后创建某些透明的点(alpha?)并显示显示在它后面的片段上的图像。所以基本上屏幕都是黑色的,除了后面的图像显示出来的几个点,我会以编程方式确定。我查看了一堆 Android 提供的图形和视图,但不知道从哪里开始。如果我只想让它全黑并带有一些 alpha 点,这是否适合 SurfaceView?

一旦我选择了要使用的正确视图,我假设我只是覆盖该onDraw()方法,然后执行类似的操作canvas.setBody(black),然后向其中添加 alpha 形状?形状会正确影响背景颜色吗?

4

1 回答 1

1

对于您的遮罩View,您可以制作一个自定义视图,该视图可以跟踪要取消遮罩的区域(如Rects 或类似的东西),然后onDraw(Canvas)像这样绘制它们:

public class MaskView extends View {

    private Set<Rect> mRects = new HashSet<Rect>();
    private Paint mUnmaskPaint = new Paint();
    {
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
    }

    /**
     * Add an unmasking rectangle to this view's background.
     *
     * @param rect
     *            a rectangle used to unmask the background
     */
    public void addUnmaskRect(Rect rect) {
        mRects.add(rect);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawColor(Color.BLACK);
        for (Rect r : mRects) {
            canvas.drawRect(r, mUnmaskPaint);
        }
    }

}

您的Fragment(或任何跟踪取消屏蔽区域的)将Rects 传递给MaskViewvia addUnmaskRect(Rect)。每当重新绘制视图时(记住invalidate()每次完成传递Rects 时都要调用),它首先用黑色填充,然后有任何矩形取消遮盖黑色背景。矩形的坐标必须设置为视图的坐标空间,但如果底层图像占据完全相同的区域,它应该相对简单(您也可以查看View.getLocationInWindow(int[])帮助您解决此问题的方法)。

于 2013-07-07T23:55:38.430 回答