2012/05/12

SortableListView改

並べ替え超苦労した!
この苦労は皆で分かち合いたい。


ここらを参考に、というか、丸ぱくりでやったんだけど、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 件のコメント:

コメントを投稿