【问题标题】:Drawing drawable using canvas - Clear destination使用画布绘制可绘制对象 - 清除目的地
【发布时间】:2015-01-29 18:23:02
【问题描述】:

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

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

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

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

<?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>

现在我想在屏幕上绘制该可绘制对象。我用这个方法画的:

 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.setColorFilter(Color.Transparent, PorterDuff.Mode.Clear);

但它似乎不起作用:/

【问题讨论】:

    标签: android canvas


    【解决方案1】:

    你让它变得比你需要的更难。画布以像素而不是对象的形式保持其上的内容。当该画布的一部分无效时,它会调用所有相关的绘制代码并请求新的像素。只需对其进行编码,使其以您想要的方式绘制,并使该区域无效。它会再次调用绘图例程并按照您绘制它们的任何顺序放置它们。

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

    只要确保您按照您想要的顺序调用这些东西,当您想要更改的内容时,让代码按该顺序绘制它。

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

    绘制之后,您修改的是像素而不是事物。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-22
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多