Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 将touchListener添加到路径对象_Android_Android Canvas_Ontouchlistener - Fatal编程技术网

Android 将touchListener添加到路径对象

Android 将touchListener添加到路径对象,android,android-canvas,ontouchlistener,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方法中在画布上绘制这些线。所以我不能通过检查用户接触的坐标来完成

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

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方法中在画布上绘制这些线。所以我不能通过检查用户接触的坐标来完成

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

path.setOnTouchListener(myTouchListner);

有人知道如何实施吗?感谢您的帮助

你能越过
ontochevent()
吗。 找到你接触过的坐标,检查坐标是否与你的路径匹配,如果它触发了你的函数

请查看下面的详细信息 没有这样的事。 路径只是一个数据结构,如何使用它(绘制、剪辑等)与此无关。触摸事件也是如此

你只需要用触摸坐标做一些数学运算。这是一个使用矩阵的二维变换。你可以看看这个

首先,您应该将接触点映射到缩放/平移坐标,看一看,然后

我没有测试,但如果您有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);
  • 值[2]
    值[5]
    是变换元素左上角的
    x,y
    坐标,与缩放因子无关
  • 值[0]
    值[4]
    分别是转换元素宽度和高度的缩放因子。如果以相同的因子进行缩放,则两者的值应相同
当您最终将接触点转换为
路径
坐标系时,您可以使用其他人在您的问题评论中建议的方法检查它是否在路径内

if (path.contains(coordX, coordY)) {
  // inside
} else {
  // outside
}
您是唯一知道您正在使用的代码以及如何在视图中转换路径坐标系的人,也是唯一知道如何正确转换回路径坐标系的人。所以,不要把这个答案看作是代码中的一部分。我只是给你指了指方向。打印一些触摸坐标/转换的日志可能会有帮助,以便在开发时对其进行调试


祝你好运。

请检查:@DucNguyen这不符合我的需要:(看起来Duc的链接肯定是解决方案的基础。我无法获得正确的坐标,因为我使用SimpleOnScaleGetStureListener在imageview中实现了缩放选项。我有一个缩放因子mScaleFactor=Math.max(0.1f,Math.min)(mScaleFactor,5.0f));在onScale(ScaleGestureDetector检测器)方法中。ah sry没有看到您问题中的这一部分“我无法获得正确的坐标,因为我在imageview中实现了缩放选项”--然后,您必须自己运行计算,才能将触摸坐标转换为缩放图像的有效坐标系。好的。这里我唯一能做的就是手动计算,我得到了。我可以找到用户触摸的点和我绘制的线之间的距离。无论如何,这将非常有用如果google实现了类似path.onTouchListner()。:)的东西。谢谢你的指导。他们不能这样做。这是一个数据结构。就像有一个地图对象,想要一个onTouchListener一样:)