3

我见过很多使用手势绘图的例子。我的要求是,我想在同一个GestureOverlayView. 为了更清楚,请看下图。

在此处输入图像描述

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

在这里回答了一个类似的问题,但有同样的问题。

请建议。

<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并从这里获取代码。它绘制多条线,但另一个问题是当我更改颜色/笔划时,最近绘制的线条也采用新的颜色/笔划。请建议这里出了什么问题。

编辑(答案):终于得到了解决方案。看看这个链接。

4

1 回答 1

4

GestureOverlayView如果不滚动您自己的版本并进行大量修改,恐怕这是不可能的。这是您需要更改的内容的概览。

考虑一下这需要什么

  1. 您将需要过去颜色设置的可迭代(或者实际上List是某种类型),或者在 Android 中需要一堆过去Paint的 s。

  2. Gestures 需要以可分离的方式存储。在内部GestureOverlayView,这些是使用 Android 存储的Path,所以这些需要是可分离的——给定路径的 api,唯一的方法是作为可以单独覆盖的不同路径实例。

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

粗略地说,上述内容使您能够迭代到最新的路径和颜色,并使用View'sdraw(Canvas canvas)方法的实例来获取thisViewsCanvas.drawPath(mLatestAddedPaths.next(), mLatestPaintColor.next())路径和绘制。

*最后,一点优化是在创建视图时创建每种可用的油漆颜色,并将其与颜色进行哈希处理,以节省油漆创建。然后,您的 mLatestPaintColor 列表将包含油漆的哈希值。

查看源代码时要查看缺少的内容,很明显,GestureOverlayView从提供此内容开始

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

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

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

然后在第 292 行,将新路径 (" path") 与当前存在的主路径(" ")组合起来,而不是存储曾经提取的每个路径:mPath

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

这意味着当涉及到 时draw(Canvas),我们不知道哪些路径是按什么顺序出现的。

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

canvas.drawPath(mPath, mGesturePaint);

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

于 2013-07-16T14:29:01.243 回答