我有一个画布,我在其上设置路径
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);
有没有人知道如何实现它?任何帮助表示赞赏。
答案 0 :(得分:1)
你可以骑过onTouchEvent()
。
找到您触摸的坐标,检查坐标是否与您的路径匹配。,如果它确实触发了您的功能..
请查看下面的详细信息 REFERENCE
答案 1 :(得分:1)
没有这样的事情。 Path只是一个数据结构,你如何使用它(draw,clip,...)与它无关。触摸事件也是如此。
你只需要用触摸坐标做一些数学运算。这是使用矩阵的2D变换。你可以阅读这个on wikipedia。
首先,您应将触摸点映射到缩放/平移坐标,查看here,here和here。
我没有测试,但是如果你有一个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
}
您是唯一知道您正在使用的代码的人,因此您在视图中如何转换路径坐标系,因此也是唯一能够知道如何正确转换它的人。因此,不要将此答案视为插入代码。我只是指出了你的方向。在开发过程中,可能有助于打印一些触摸坐标/转换的日志以进行调试。
祝你好运。