现在,我拥有它,以便我的布局包含一个占据整个屏幕并显示图像的Fragment
。我想这样做,以便在其上面存在额外的View
,同时占据整个屏幕。在那个顶层,我希望能够将它全部涂成黑色,然后创建透明的某些斑点(alpha?)并显示其后面片段上显示的图像。所以基本上屏幕都是黑色的,除了后面的图像显示的几个点,我将以编程方式确定。我已经查看了Android提供的一堆图形和视图,但不知道从哪里开始。这是否适合SurfaceView,如果我只是想让它全黑并带有一些alpha斑点?
一旦我选择了要使用的正确视图,我假设我只是覆盖onDraw()
方法,然后执行canvas.setBody(black)
之类的操作,然后添加alpha形状?形状是否会正确影响背景颜色?
答案 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
(或跟踪取消屏蔽区域的任何内容)会通过Rect
将MaskView
传递给addUnmaskRect(Rect)
。每当重绘视图时(记得每次传递invalidate()
时都要调用Rect
),它首先用黑色填充,然后有任何矩形取消屏蔽黑色背景。矩形的坐标必须设置为视图的坐标空间,但如果底层图像占据完全相同的区域,则它应该相对简单(您还可以查看View.getLocationInWindow(int[])
方法来帮助您孔)。