この苦労は皆で分かち合いたい。
ここらを参考に、というか、丸ぱくりでやったんだけど、GB Android2.3ではうまくいくんだが、ICS Android4.0でうまくいかない。
ICSだとタッチした所の下項目が選択されて、ドラッグする位置が変になる。
この解析がまぁ意味わからんかったが、 オレなりの結論が出た。
ICSからTouch処理らへんがネイティブに書き換えられたことで、タッチのイベントの処理が変わった様子。
具体的には。
処理は、onTouchEvent, ACTION_DOWN→onItemLongClickの順で、タッチ時のイベントを保存、長押し時にそのイベントから位置とかを取得する。mActionDownEventね。
mActionDownEventが、onItemLongClickの時、getYがgetRawYになっちゃってる。
たぶん計算途中が見えてるんじゃなかなー、と。
んで、解決策は。
class MotionEventLite{ってクラス作る。
float x = 0;
float y = 0;
float eventTime = 0;
float downTime = 0;
public MotionEventLite() {
}
public MotionEventLite(MotionEvent event) {
setEvent(event);
}
public void setEvent(MotionEvent event){
x = event.getX();
y = event.getY();
eventTime = event.getEventTime();
downTime = event.getDownTime();
}
public float getX(){
return(x);
}
public float getY(){
return(y);
}
public float getEventTime(){
return(eventTime);
}
public float getDownTime(){
return(downTime);
}
}
private MotionEventLite mActionDownEvent = new MotionEventLite();
に変える。 これで参照じゃなくなる。
後は、
storeMotionEvent(new MotionEventLite(event));
こんな感じでMotionEvent→MotionEventLiteへの置き換え。
わかってみると簡単だが、これでも苦労したんよ。
0 件のコメント:
コメントを投稿