2013-01-07 38 views
1

我有一個View,我想爲可拖動所以我已經覆蓋了onTouchEvent(MotionEvent event)方法,對移動事件,我重新定位/翻譯我View基於事件行動的(X,Y)座標。然而!在拖我View正確的 - 例如 - 我看到了事件操作的x座標並不穩步增加(即... 15,16,17,18 ...),而是交錯(即... 15,23,16,24,17,25 ...),因此我的View以一種急躁的方式移動。 (同樣,對於拖動左,上,下等)Move操作催人淚下

任何人都知道這可能是爲什麼,我該如何避免呢?

這裏是我的onTouchEvent(..)方法...

@Override 
public boolean onTouchEvent(MotionEvent event) 
{ 
    switch (event.getAction()) 
    { 
    case MotionEvent.ACTION_DOWN: 
    // make note of the down action's (x, y) coordinate 
    action_down_x = event.getX(); 
    action_down_y = event.getY(); 
    return true; 
    case MotionEvent.ACTION_MOVE: 
    // work out displacement 
    dX = event.getX() - action_down_x; 
    dY = event.getY() - action_down_y; 
    // code here to move the view 
    return true; 
    case MotionEvent.ACTION_UP: 
    return true; 
    } 

    return super.onTouchEvent(event); 
} 

回答

1

的問題很簡單:你有兩個相對座標工作。如果從視圖中覆蓋onTouchEvent(),則可能會得到值10,10。如果你現在移動手指,你會得到一個新的價值,可以說,9,9,所以你改變,這將導致在事實視圖的位置,你的手指是在視圖再次座標系10,10。

我會怎麼做:重寫父級的onTouchEvent(),讓你在同一座標系中停留。你的實現看起來不錯,所以當你將代碼移動到父視圖/活動時它應該很容易工作。

+0

問題解決了。謝謝。唯一不利的一面是我現在必須確定從父級觸摸事件的座標中按下哪個子視圖。 –

+1

由於每個視圖應該有存儲的界限,它應該是一個簡單的循環,其中觸摸事件打孩子視圖的邊界。不難做:)提示:'Rect.contains(x,y)' – WarrenFaith