gpt4 book ai didi

android - 将 touchListener 添加到路径对象

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:41:36 26 4
gpt4 key购买 nike

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

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 方法中在 Canvas 上绘制了这条线。所以我不能通过检查用户触摸的坐标来做到这一点。

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

path.setOnTouchListener(myTouchListner);

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

最佳答案

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

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

首先你应该将触摸点映射到缩放/平移坐标,看看here , herehere .

我没有测试但是如果你有一个 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;
}

我无法告诉您这是否适合您开箱即用,因为我不知道您对 Path 有何用途,我只能假设您使用它在图像上绘图。如果在绘制路径之前应用任何其他转换,则应改用应用到路径的转换。

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

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 检查它是否在 Path 内其他人已经在您的问题的评论中建议的方法。

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

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

祝你好运。

关于android - 将 touchListener 添加到路径对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35861990/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com