对于您的遮罩View
,您可以制作一个自定义视图,该视图可以跟踪要取消遮罩的区域(如Rect
s 或类似的东西),然后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
s 传递给MaskView
via addUnmaskRect(Rect)
。每当重新绘制视图时(记住invalidate()
每次完成传递Rect
s 时都要调用),它首先用黑色填充,然后有任何矩形取消遮盖黑色背景。矩形的坐标必须设置为视图的坐标空间,但如果底层图像占据完全相同的区域,它应该相对简单(您也可以查看View.getLocationInWindow(int[])
帮助您解决此问题的方法)。