多个颜色/笔触手势并在同一个GestureOverlayView中持久绘制

时间:2013-07-10 11:22:43

标签: java android colors android-canvas gesture

我见过许多使用手势绘图的例子。我的要求是,我想在同一GestureOverlayView中绘制多色和多次描边手势。为了更清楚,请看下面的图像。

enter image description here

如果用户选择不同的颜色和不同的笔划,绘图应该是相应的颜色/笔划。现在,它绘制了不同颜色和不同的笔触手势但如果我选择不同颜色或不同笔划,之前绘制的手势也会采用新颜色或新笔划

回答了一个类似的问题here,但问题相同。

请建议。

<android.gesture.GestureOverlayView
       android:id="@+id/signaturePad"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:background="@android:color/white"
       android:eventsInterceptionEnabled="false"
       android:fadeEnabled="false"
       android:fadeOffset="122000"
       android:gestureStrokeLengthThreshold="0.1"
       android:gestureStrokeWidth="6"
       android:gestureStrokeType="multiple"
       android:orientation="vertical" >

   </android.gesture.GestureOverlayView>

在java代码中,更改颜色代码

mGestureOverlayView.setGestureColor(Color.BLUE);

感谢。

修改:考虑与Canvas实施相同的内容,并获得here的代码。它绘制多条线但又一个问题是当我改变颜色/笔划时,最近绘制的线条也采用新的颜色/笔划。 请说明这里出了什么问题。

编辑(答案):终于得到了解决方案。请查看this链接。

1 个答案:

答案 0 :(得分:4)

我担心如果不对你自己的版本GestureOverlayView进行大量修改就不可能做到这一点。以下是您需要更改的内容。

考虑工作需要什么

  1. 您需要过去的颜色设置的可迭代(或实际上,某种类型的List - 或Android中的过去Paint的堆栈。

  2. Gesture s需要以可分离的方式存储。在GestureOverlayView里面,这些是使用Android Path存储的,所以这些需要是可分离的 - 给定路径的api,唯一的方法是将不同的路径实例分开覆盖。

  3. 最后,路径上必须有排序,以便颜色和路径之间可以建立关联。

  4. 以上粗略的说法是,您可以迭代到最新的路径和颜色,并使用View draw(Canvas canvas)方法的实例来thisViewsCanvas.drawPath(mLatestAddedPaths.next(), mLatestPaintColor.next()) foreach路径和油漆

    *最后,一点点优化是在创建视图时创建每个可用的颜色,并根据颜色对其进行散列,以节省绘画创建。然后,您的mLatestPaintColor列表将包含涂料的哈希值。

    要查看,如果您查看source ,很明显GestureOverlayView正在提供此

    1. 查看您在问题中引用的setGesutreColor(color)。所有这一切都设置了一个字段mCertainGestureColor,然后用于设置所有绘图的颜色。

    2. 相当明智的是,当你调用setGesture(Gesture gesture)时(每次你做出一个手势),这个类的开发人员会在这个特定版本的第286行提取路径:

      最终路径路径= mCurrentGesture.toPath();

    3. 然后,它们不是存储所有提取的路径,而是将新路径(“path”)与当前存在的主路径(“mPath”)组合在一起,在第292行:< / p>

      mPath.addPath(path, -bounds.left + (getWidth() - bounds.width()) / 2.0f, -bounds.top + (getHeight() - bounds.height()) / 2.0f);
      

      这意味着当谈到draw(Canvas)时,我们不知道哪个路径来自哪个。

      3。这最终让我了解为什么3不起作用 - 第394行的绘制方法可用的信息仅足以绘制每条路径相同的颜色:

      canvas.drawPath(mPath, mGesturePaint);
      

      所以,应该很有可能自己重新实现这个类来实现你的目标,但是用当前的类来尝试实现你想要的东西几乎是不可能的。