Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 创建一个;删去“;布局_Android_Android Layout - Fatal编程技术网

Android 创建一个;删去“;布局

Android 创建一个;删去“;布局,android,android-layout,Android,Android Layout,现在,我有了它,因此我的布局由一个占据整个屏幕并显示图像的片段组成。我想让它成为一个额外的视图存在于它的顶部,同时占据整个屏幕。在顶层,我希望能够将其最初全部涂成黑色,然后创建某些透明点(alpha?),并显示其后面片段上显示的图像。因此,基本上,屏幕将是全黑的,除了后面的图像显示通过的几个点,我将通过编程确定。我研究了Android提供的一系列图形和视图,但不知道从哪里开始。如果我只想让它全黑并带有一些alpha斑点,这适合表面视图吗 一旦我选择了要使用的正确视图,我假设我只是覆盖onDraw

现在,我有了它,因此我的布局由一个占据整个屏幕并显示图像的
片段组成。我想让它成为一个额外的
视图
存在于它的顶部,同时占据整个屏幕。在顶层,我希望能够将其最初全部涂成黑色,然后创建某些透明点(alpha?),并显示其后面片段上显示的图像。因此,基本上,屏幕将是全黑的,除了后面的图像显示通过的几个点,我将通过编程确定。我研究了Android提供的一系列图形和视图,但不知道从哪里开始。如果我只想让它全黑并带有一些alpha斑点,这适合表面视图吗


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

对于遮罩
视图
,您可以创建一个自定义视图,跟踪要取消遮罩的区域(如
Rect
s或类似),然后在
onDraw(画布)
中绘制它们,如下所示:

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);
        }
    }

}
公共类MaskView扩展视图{
private Set mRects=new HashSet();
private Paint mUnmaskPaint=新油漆();
{
setXfermode(新的PorterDuffXfermode(PorterDuff.Mode.CLEAR));
}
/**
*将取消遮罩矩形添加到此视图的背景。
*
*@param rect
*用于取消背景遮罩的矩形
*/
公共void addUnmaskRect(Rect-Rect){
mRects.add(rect);
}
@凌驾
受保护的void onDraw(画布){
画布。drawColor(颜色。黑色);
for(矩形r:mRects){
画布.drawRect(r,mUnmaskPaint);
}
}
}

您的
片段
(或跟踪取消掩码区域的任何内容)通过
addUnmaskRect(Rect)
传递到
MaskView
。每当重新绘制视图时(记住每次通过
Rect
s时调用
invalidate()
),视图首先填充黑色,然后让任何矩形取消黑色背景的遮罩。矩形的坐标必须设置为视图的坐标空间,但如果基础图像占据完全相同的区域,它应该相对简单(您也可以查看
视图.getLocationInWindow(int[])
方法来帮助您完成此操作)。

对于遮罩
视图
,您可以创建一个自定义视图,跟踪要取消屏蔽的区域(如
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);
        }
    }

}
公共类MaskView扩展视图{
private Set mRects=new HashSet();
private Paint mUnmaskPaint=新油漆();
{
setXfermode(新的PorterDuffXfermode(PorterDuff.Mode.CLEAR));
}
/**
*将取消遮罩矩形添加到此视图的背景。
*
*@param rect
*用于取消背景遮罩的矩形
*/
公共void addUnmaskRect(Rect-Rect){
mRects.add(rect);
}
@凌驾
受保护的void onDraw(画布){
画布。drawColor(颜色。黑色);
for(矩形r:mRects){
画布.drawRect(r,mUnmaskPaint);
}
}
}

您的
片段
(或跟踪取消掩码区域的任何内容)通过
addUnmaskRect(Rect)
传递到
MaskView
。每当重新绘制视图时(记住每次通过
Rect
s时调用
invalidate()
),视图首先填充黑色,然后让任何矩形取消黑色背景的遮罩。矩形的坐标必须设置为视图的坐标空间,但如果基础图像占据完全相同的区域,则应该相对简单(您也可以查看
视图.getLocationInWindow(int[])
方法来帮助您完成此操作).

我尝试过使用您的unmask paint示例,如下所示:
canvas.drawCircle(10010030,mUnmaskPaint)
和应用程序关闭(但不会崩溃)。在LogCat中,我可以看到
07-07 20:04:29.806:A/libc(26164):0x00000004(code=1)处的致命信号11(SIGSEGV),线程26164()
。有什么想法吗?我觉得我很接近了。很高兴它能起作用!我会对在onDraw()中创建新对象持谨慎态度,但是…它应该尽可能地轻量级。如果你在你的项目上运行Android Lint,它可能会弹出一条警告,说同样的话。我认为最好的做法是在其他地方创建和设置绘画,并将其作为视图生命周期的实例变量保存在内存中。我曾尝试使用您的unmask绘画示例,如下所示:
canvas.drawCircle(100,100,30,mUnmaskPaint)
和应用程序关闭(但不会崩溃)。在LogCat中,我可以看到
07-07 20:04:29.806:A/libc(26164):0x00000004(code=1)处的致命信号11(SIGSEGV),线程26164()
。有什么想法吗?我觉得我很接近了。很高兴它能起作用!我会对在onDraw()中创建新对象持谨慎态度,但是…它应该尽可能地轻量级。如果你在你的项目上运行Android Lint,它可能会弹出一条警告,说同样的话。我认为最好的做法是在其他地方创建和设置绘画,并将其作为视图生命周期的实例变量保存在内存中。