使用画布绘制drawable - 清除目的地

时间:2015-01-29 18:23:02

标签: android canvas

我有自定义视图。我通过在onDraw中调用此方法,使用全屏矩形创建全屏透明叠加:

  private void drawOverlay(Canvas canvas) {
        canvas.drawRect(0, 0, this.getWidth(), this.getMeasuredHeight(), backgroundPaint);
    }

我的屏幕现在覆盖了我之前定义的透明背景。

现在,我想在屏幕上绘制一个Drawable。可绘制的可以在其上具有透明部分。它可以是,例如,形状,定义如下:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">

    <solid android:color="@color/transparent"></solid>
    <stroke android:width="10dp" android:color="#ffff0716"/>
</shape>

现在我想在屏幕上绘制那个drawable。我用这种方法绘制它:

 private void drawDrawableOverTargetView(Canvas canvas) {
        Rect rect = new Rect(200, 200, 450, 400); //TODO
        Drawable drawable = tutorial.getHighlightDrawable();
        drawable.setBounds(rect);
        drawable.draw(canvas);
    }

我椭圆形的内部在xml中定义为透明。显示时,椭圆的内部部分将是叠加颜色,因为叠加矩形在其下方。 问题是:是否可以定义drawable应该覆盖背景矩形的颜色,这意味着它的内部变得透明?是否可以删除我的drawable下面的覆盖矩形部分?

我尝试使用

drawable.setColorFilter(Color.Transparent, PorterDuff.Mode.Clear);

但它似乎不起作用:/

1 个答案:

答案 0 :(得分:1)

你做得比你需要的更难。画布以像素而不是对象来维护它们上面的内容。当该画布的一部分无效时,它会调用与此相关的所有绘制代码​​并询问新像素。只需对其进行编码,使其以您喜欢的方式绘制,并使该区域无效。它将再次调用绘制例程并按照您绘制它们的顺序放置它们。

画布不会回想起对象下的背景颜色,因为只有像素而不是对象。存在对象的唯一意义是绘制对象,这会导致在画布上呈现对象。但你不能删除它。但是,您可以声明绘制该对象的区域无效,并且在刷新时,下次调用绘图时不会绘制该对象。

请确保按照您想要的顺序调出内容,因为您想要更改内容,请让代码按顺序绘制。

除了混合操作之外,您无法更改屏幕上已有的内容,Porter-Duff操作只是处理您可以在屏幕上操作像素的所有逻辑方式。例如,CLEAR将该区域恢复为纯透明。这基本上只是清除屏幕的那一部分。屏幕上没有圆圈。您正在将透明像素写入一组看起来像圆圈的像素。不要那样做。当你不想要那个圆形的东西时,宣布图片无效,当它再次调用绘图程序时,不要画那个圆圈。

绘制后,你修改像素而不是修改像素。