Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.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
Java MotionEvent多点触摸偏移(多个指针)_Java_Android_Multi Touch_Motionevent - Fatal编程技术网

Java MotionEvent多点触摸偏移(多个指针)

Java MotionEvent多点触摸偏移(多个指针),java,android,multi-touch,motionevent,Java,Android,Multi Touch,Motionevent,我已经实现了一个ZoomViewGroup,它能够在所有方向上无限滚动,也可以无限缩放,同时仍能将所有触摸事件正确地偏移到其子视图上 但当涉及到多点触摸时,只有第一个指针偏移正确,而所有其他指针都指向错误的位置,这是因为我必须考虑比例因子。(当缩放系数!=1.0f时,指针0与其原始位置的偏移量不同于指针1或2) 我将我的转换保存在一个矩阵中,因此使用Matrix.mapPoints(…)和矩阵求逆可以很容易地计算从屏幕到工作区以及从屏幕到工作区的坐标 当我绘制子视图时,我可以像这样应用变换矩阵:

我已经实现了一个
ZoomViewGroup
,它能够在所有方向上无限滚动,也可以无限缩放,同时仍能将所有触摸事件正确地偏移到其子视图

但当涉及到多点触摸时,只有第一个指针偏移正确,而所有其他指针都指向错误的位置,这是因为我必须考虑比例因子。(当
缩放系数!=1.0f
时,指针0与其原始位置的偏移量不同于指针1或2)

我将我的转换保存在一个
矩阵中
,因此使用
Matrix.mapPoints(…)
和矩阵求逆可以很容易地计算从屏幕到工作区以及从屏幕到工作区的坐标

当我绘制子视图时,我可以像这样应用变换矩阵:

protected void dispatchDraw(Canvas canvas)
{
    canvas.save();
    canvas.concat(transformation_matrix);

    super.dispatchDraw(canvas);
    canvas.restore();
}
与触摸事件相同:

float[] touch_array = new float[2];

public boolean dispatchTouchEvent(MotionEvent event)
{
    touch_array[0] = event.getX();
    touch_array[1] = event.getY();
    transformation_matrix.mapPoints(touch_array);

    event.setLocation(touch_array[0], touch_array[1]);
    return super.dispatchTouchEvent(event);
}

但实际上所有指针的偏移量是相同的。如果我们放大2.0倍,每个指针的偏移量是不同的,因此我必须能够分别为每个指针执行类似
MotionEvent.setlocation(int-pointer\u index,float x,float y)
。我能做些什么来实现这一点吗?

编辑:到目前为止,我知道(并搜索到)的唯一解决方案是使用新坐标创建一个新的MotionEvent

--

您可以通过getX(int pointerId)/getY(int)方法获得所有指针(手指接触)的位置

您可以通过getPointerCount()获取所有屏幕上的指针

因此,要解析multi-touch,您必须执行以下操作:

public boolean dispatchTouchEvent(MotionEvent event)
{
    for(int i = 0; i < event.getPointerCount(); i++){
        touch_array[0] = event.getX(i);
        touch_array[1] = event.getY(i);
        transformation_matrix.mapPoints(touch_array);
        MotionEvent copy = MotionEvent.obtainNoHistory(event);
        copy.setLocation(touch_array[0], touch_array[1]);
        boolean handled = super.dispatchTouchEvent(copy);
        copy.recycle();
        if(handled) return true;
    }
    return false;
}
公共布尔dispatchTouchEvent(MotionEvent事件)
{
for(int i=0;i
还要注意,我创建了MotionEvent对象的一个副本,因此childrem可以修改它,而无需通过for中断位置


抱歉,刚才我注意到你的上一句话,你必须将事件复制到一个新的MotionEvent,这样childrem就可以自己解析并执行它的工作,复制也会使你的代码不受修改,直接更改MotionEvent是个坏主意,因为它可以在任何分派方法中中断for循环。

但是这样,当您将多点触控事件拆分到此处时,孩子就无法接收到多点触控事件。好的,我对多点触控做了概述,您可以在子dispatchTouchEvent中实现该代码。请注意,您可能希望在父视图中解析为PanGesture,或者在两个不同的childrem视图中解析为两个单独的DragsPictures,你必须考虑你想解析的案例来做最好的方法。不,我不能在孩子们中处理这个问题,因为我用它作为Android定义的视图的根布局,我不想修改,所以…我明天会试试这个,并告诉你结果:)