Android画布绘制路径,带有多个"绘图工具"和橡皮擦矢量(避免bmps和使用透明bg)

时间:2014-02-25 19:37:56

标签: android canvas android-canvas android-drawable

我正在开发一个程序,可以让你绘制高光,笔和文本注释标记。我有一个工作版本,我回收bmp 3次,然后将其绘制到画布上。

问题是我的应用程序在内存中有3个这样的视图,因此创建了很多bmps。

在我目前的解决方案中,我试图避免颠簸。我扩展了一个ImageView并将以下内容添加到Draw事件中:

`

public override void Draw (Canvas canvas)
{
    base.Draw (canvas);
    HighlightLayer.Draw(canvas, Width, Height);
    PenLayer.Draw(canvas, Width, Height);
    TextLayer.Draw(canvas, Width, Height);
}

`

请注意,我使用的是monodroid,因此它是C#(但与Java几乎相同),所有“Layer”对象都是Drawable的子类。假设他们有绘制路径命令等。

无论如何,除了所有的亮点/笔周围都有黑框之外,它还有一些作品。

当我绘制一条线(不是橡皮擦)时,我使用PorterDuff.Mode.Src。

我试图将3合并为一个bmp而不是回收它,但问题是,如果我有一个橡皮擦矢量,它将擦除已经绘制的任何东西。因此,擦除的笔线也会消除亮点......

  1. 是否可以“冻结”绘图,以便在画布上继续绘制路径并更改PorterDuff模式以清除它时不会影响任何标记为冻结的内容?

  2. 我知道我在Drawables的线条周围看到的黑匣子是由于没有设置背景bmp。问题是我希望它们是ImageView之上的图层。如果他们每个都保留了背景,那么你就看不到下面的Drawable了。我如何使用具有“父ImageView”背景的drawable并避免它假定在那里的黑色背景。

  3. 不知何故,当选择透明填充以避免默认黑色时,我需要将“父”ImageView的背景应用于Drawables。

    解决方案:

    使用下面的建议我创建了一个LayerDrawable并为每个标记工具添加了Drawables。在Drawable中,在绘制线之前,我添加了以下代码:

    public override void Draw (Canvas canvas)
    {
        canvas.SaveLayer(new RectF(0,0,Bounds.Width(),Bounds.Height()), null, SaveFlags.All);
        canvas.DrawColor(Color.Transparent, PorterDuff.Mode.Clear);
        GraphicsUtil.DrawVector(canvas, Lines, ToolID, Bounds.Width(), Bounds.Height());
    
    }
    

0 个答案:

没有答案