2015-09-25 88 views
0

我已經實現了一個ZoomViewGroup,它能夠無限地向各個方向滾動,並且可以無限地縮放,同時仍然正確地向其子View s正確提供所有的觸摸事件。MotionEvent多點觸控偏移量(多指針)

但是,當涉及到多點觸摸,只有第一個指針偏移正確,和所有其他人都指向了錯誤的位置,那是因爲有比例因子我要照顧。 (作爲指針0有不同的從其原始位置偏移比指針1或2,當scaling_factor != 1.0f

我救了我的轉變在Matrix,所以很容易從屏幕計算座標到工作區和背部使用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); 
} 

MotionEvent.setLocation(float x, float y)並實際上是由相同的偏移所有指針量。如果我們2.0F放大的偏移量是每個指針不同,所以我必須要能夠做到像MotionEvent.setLoction(int pointer_index, float x, float y)爲每個單獨的一個。有什麼我可以做到這一點?

回答

0

編輯:我知道(和搜索),唯一的解決辦法,到目前爲止是創建一個具有新座標的新MotionEvent。

-

你可以得到所有的指針(手指觸摸)位置低谷方法的getX(INT pointerId)/的getY(INT)。

你可以得到所有在屏幕上的指針線槽getPointerCount()

因此解析多點觸控,你必須做一些事情,如:

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

另外請注意,我創建的MotionEvent對象的副本,所以Childrem可以修改它而不會打破位置。

對不起,剛纔我注意到你最後的聲明,你必須將事件複製到一個新的MotionEvent中,以便childrem可以解析它自己並完成它的工作,複製也會使你的代碼安全地修改,這是一個糟糕的主意直接更改MotionEvent,因爲它可以在任何調度方法中打破for循環。

+0

但這種方式,你將它們分割在這裏 – bricklore

+0

好一個孩子不能收到多點觸摸事件,我做了一個關於多點觸控概述,可以實現在孩子dispatchTouchEvent代碼。 –

+0

請注意,你可能要解析作爲家長或在兩個不同的childrem視圖中的兩個separete DragsGestures一個PanGesture,你必須考慮你要分析做的最好的辦法的情況下。 –