创建“剪切”布局

时间:2013-07-07 21:57:45

标签: android android-layout

现在,我拥有它,以便我的布局包含一个占据整个屏幕并显示图像的Fragment。我想这样做,以便在其上面存在额外的View,同时占据整个屏幕。在那个顶层,我希望能够将它全部涂成黑色,然后创建透明的某些斑点(alpha?)并显示其后面片段上显示的图像。所以基本上屏幕都是黑色的,除了后面的图像显示的几个点,我将以编程方式确定。我已经查看了Android提供的一堆图形和视图,但不知道从哪里开始。这是否适合SurfaceView,如果我只是想让它全黑并带有一些alpha斑点?

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

1 个答案:

答案 0 :(得分:1)

对于您的屏蔽View,您可以创建一个自定义视图,可以跟踪要取消屏蔽的区域(如Rect或类似的东西),然后在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(或跟踪取消屏蔽区域的任何内容)会通过RectMaskView传递给addUnmaskRect(Rect)。每当重绘视图时(记得每次传递invalidate()时都要调用Rect),它首先用黑色填充,然后有任何矩形取消屏蔽黑色背景。矩形的坐标必须设置为视图的坐标空间,但如果底层图像占据完全相同的区域,则它应该相对简单(您还可以查看View.getLocationInWindow(int[])方法来帮助您孔)。