1

このトピックに従ってジェスチャリスナーを実装しました:ListView水平フリングジェスチャ

ただし、リストのスクロールが遅く、(非常にゆっくりスクロールすると)ブロックされることもあります。問題はリスナーにあると思います。値の計算には時間がかかるため、検索している実際の「左から右」のフリングを取得します...より効率的な方法はありませんか?

編集

問題はここにあります:

@Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) {
            return false;
        }

        // right to left swipe
        if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
            System.out.println("right to left");
            animatedStartActivity(0);

            // right to left swipe
        }  else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
            System.out.println("left to right");
            animatedStartActivity(1);
        }

        return false;
    }

この方法の評価には時間がかかります

edit2: 問題は、listviewにすでに独自のジェスチャリスナーがあり、私のものをアタッチするとそれが上書きされるためだと思います。リストビュージェスチャリスナーは速度と加速度も考慮に入れて、優れた移動効果を与えるため、これは問題です。私のリスナーはかなり生であるため、リストのスクロールはもうスムーズではありません。onFLingメソッドが常にfalseを返したとしても(イベントを消費しないため)、リストのスクロールは影響を受けます...

edit3:わかりました、解決策を見つけたかもしれませんが、あなたの助けが必要です!コンテナレイアウトでonTouchListenerを設定できます。問題は、listviewが実際に親のonTouchをオーバーライドするため、状況を逆転させる必要があることです。listviewのonTouchEventは親によってインターセプトされる必要があるため、falseを返すとlistviewになります。

4

1 に答える 1

0

解決しました!!! 問題は、ListView の onTouchEvent が他の操作を実行していたことです。だから私はListViewを拡張しました:

public class FlingListView extends ListView{

private GestureDetector detector; //this is my detector

public void setDetector(GestureDetector detector){
    this.detector = detector;
}

public FlingListView(Context context) {
    super(context);
    // TODO Auto-generated constructor stub
}

public FlingListView(Context context,AttributeSet set) {
    super(context,set);
    // TODO Auto-generated constructor stub
}

public FlingListView(Context context,AttributeSet set, int a) {
    super(context,set,a);
    // TODO Auto-generated constructor stub
}

     //here I do the magic
@Override
public boolean onTouchEvent(MotionEvent ev) {
    // TODO Auto-generated method stub
    super.onTouchEvent(ev); //I always do the list on touch event
    return(detector.onTouchEvent(ev)); //..but I return the detector!

}
 }

これが最善の解決策かどうかはわかりませんが、それでも...うまくいきます!

于 2012-09-29T15:09:58.030 に答える