私は4つの水平スクロールビューを垂直に積み重ねており、それらは画面全体を占めています。画面のどこでも縦方向に下にスワイプしたことを検出し、それが発生したときに特定の機能を実行できるようにしたいと考えています。onTouchListener のある画面に空のレイアウトを配置し、開始 Y 位置と終了 Y 位置を計算してダウンスワイプを検出し、一定の距離であれば関数を呼び出します。
問題は、ビューがタッチ イベントを消費する方法にあります。垂直スワイプイベントを検出するか、水平スクロールビューをスクロールできるかのどちらかしかないようですが、両方を検出できるソリューションが見つかりません(つまり、下にスワイプした場合はそれを登録し、そうでない場合は水平スクロールビューを左に移動させます/右)。
horizontalscrollviews はカスタマイズされており、独自の ontouchlisteners が含まれていることに注意する必要がありますが、モーションが下向きのスワイプではない場合は常に、空のレイアウトからスクロールビューにタッチイベントを渡すことが問題であるため、これは実際には問題になりません。 . (ACTION_UP で計算を実行したくないことに注意してください。ユーザーが画面を下に移動しているときに指を離したままにしておくと、指を離さなくてもアクションが呼び出されます)
これは、空のレイアウトでのタッチを検出するために使用している抽出されたコードです(現在、下方向のスワイプは検出されていません...しかし、スクロールビューは移動します。最後のreturnステートメントをtrueに変更すると、ダウンを検出できますスワイプしますが、スクロールビューは左右に移動しません. 両方を許可する方法が必要だと思いますか?) 助けてくれてありがとう!:
touchArea.setOnTouchListener(new OnTouchListener()
{
float startY;
float startX;
public boolean onTouch(View v, MotionEvent event)
{
Log.d(TAG, "in onTouch");
switch (event.getAction())
{
case MotionEvent.ACTION_DOWN:
startX = event.getX();
startY = event.getY();
Log.d(TAG, "action down");
Log.d(TAG, "start x is: " + startX + " startY is: " + startY);
case MotionEvent.ACTION_MOVE:
Log.d(TAG, "action move");
if(event.getY() - startY > MIN_SWIPE_DISTANCE)
{
Log.d(TAG, "swipe down");
//EXECUTE FUNCTION HERE
return true;
}
else
{
return false;
}
case MotionEvent.ACTION_UP:
Log.d(TAG, "ACTION UP");
break;
case MotionEvent.ACTION_CANCEL:
Log.d(TAG, "ACTION CANCEL");
break;
default:
Log.d(TAG, "unknown touch event");
break;
}
return false;
}
});