将touchListener添加到路径对象

时间:2016-03-08 08:01:31

标签: android android-canvas ontouchlistener

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

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);

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

2 个答案:

答案 0 :(得分:1)

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

请查看下面的详细信息 REFERENCE

答案 1 :(得分:1)

没有这样的事情。 Path只是一个数据结构,你如何使用它(draw,clip,...)与它无关。触摸事件也是如此。

你只需要用触摸坐标做一些数学运算。这是使用矩阵的2D变换。你可以阅读这个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方法检查路径是否在路径内。

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

您是唯一知道您正在使用的代码的人,因此您在视图中如何转换路径坐标系,因此也是唯一能够知道如何正确转换它的人。因此,不要将此答案视为插入代码。我只是指出了你的方向。在开发过程中,可能有助于打印一些触摸坐标/转换的日志以进行调试。

祝你好运。