このトピックに従ってジェスチャリスナーを実装しました: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になります。