【问题标题】:Adding touchListener to path object将 touchListener 添加到路径对象
【发布时间】:2016-06-22 01:55:57
【问题描述】:

我有一个画布,我在上面设置了路径

Path path = new Path();
path.moveTo(1, 1);
path.lineTo(90, 1);
path.lineTo(90, 60);
path.lineTo(1, 60);

canvas.drawPath(path,p);

现在我想为此路径对象实现一个触摸侦听器。

我在自定义 ImageView 上实现了缩放选项,并在此自定义 ImageView 的 onDraw 方法中在画布上绘制了这条线。所以我不能通过检查用户触摸的坐标来做到这一点。

我知道路径对象不是 View Class 的子对象,因此我无法在其中实现 touchListner。但我真正需要的是类似

path.setOnTouchListener(myTouchListner);

有人知道如何实现它吗?任何帮助表示赞赏。

【问题讨论】:

标签: android android-canvas ontouchlistener


【解决方案1】:

没有这样的事情。 Path 只是一种数据结构,与您如何使用它(绘制、剪辑、...)无关。触摸事件也是如此。

您只需要对触摸坐标进行一些数学运算。这是使用矩阵的二维变换。你可以阅读这个on wikipedia

首先您应该将触摸点映射到缩放/平移的坐标,看看hereherehere

我没有测试,但如果你有一个 ImageView 这个方法应该这样做:

final float[] getPointerCoords(ImageView view, MotionEvent e)
{
    final int index = e.getActionIndex();
    final float[] coords = new float[] { e.getX(index), e.getY(index) };
    Matrix matrix = new Matrix();
    // invert compute the inverse transformation matrix
    view.getImageMatrix().invert(matrix);
    // this adjust the panning
    matrix.postTranslate(view.getScrollX(), view.getScrollY());
    // this apply the inverse transformation to your touch points
    // which should give you the coordinates on your imageview
    matrix.mapPoints(coords);
    return coords;
}

我不能告诉你这是否适合你,因为我不知道你有什么用的路径,我只能假设你用它来绘制你的图像。如果您在绘制路径之前应用任何其他转换,则应使用应用于路径的转换。

如果您在画布上进行这些转换,您可以像这样提取矩阵:

Matrix matrix = canvas.getMatrix()

另一种方法是将矩阵值提取到数组中并自己进行计算:

// Get the values of the matrix
// create this array in a field an reuse it for performances
float[] values = new float[9];
matrix.getValues(values);
  • values[2]values[5] 是变换后元素左上角的 x,y 坐标,与缩放系数无关
  • values[0]values[4] 分别是转换后元素宽度和高度的缩放因子。如果您以相同的倍数缩放,则它们应该是相同的值。

当您最终将触摸点转换为 Path 坐标系时,您可以使用 this 方法检查它是否在路径内,其他人已经在您的问题的 cmets 中提出了建议。

if (path.contains(coordX, coordY)) {
  // inside
} else {
  // outside
}

您是唯一知道您正在使用的代码以及路径坐标系如何在您的视图中转换的人,因此也是唯一知道如何正确将其转换回来的人。因此,不要将此答案视为插入代码。我只是给你指了个方向。打印一些触摸坐标/转换的日志以在开发时对其进行调试可能会有所帮助。

祝你好运。

【讨论】:

  • 好的。我在这里唯一能做的就是一些手动计算,我明白了。我可以找到用户接触的点和我画的线之间的距离。无论如何,如果谷歌实现了类似 path.onTouchListner() 的东西,这将非常有帮助。 :) 。感谢您的指导。
  • 他们不能这样做。它是一种数据结构。这就像拥有一个 Map 对象并想要一个 onTouchListener :)
【解决方案2】:

你可以骑onTouchEvent()吗? 找到你触摸过的坐标,检查坐标是否与你的路径匹配。如果它确实触发了你的功能..

详情请查看下方 REFERENCE

【讨论】:

  • 我无法获得正确的坐标,因为我使用 SimpleOnScaleGestureListener 在图像视图中实现了缩放选项。我有一个比例因子 mScaleFactor = Math.max(0.1f, Math.min(mScaleFactor, 5.0f));在 onScale(ScaleGestureDetector 检测器) 方法中。
  • 对不起,你的问题中没有看到那部分
  • “我无法获得正确的坐标,因为我在图像视图中实现了缩放选项”——您必须自己运行计算,然后才能从触摸坐标转换为有效坐标系你的缩放图像。
猜你喜欢
  • 2014-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-17
  • 1970-01-01
  • 2021-02-25
  • 2014-03-04
相关资源
最近更新 更多