4

ここでは、特定のリスト ビューのアイテム内にカスタム コントロールを配置するという、突飛なアイデアを試しています。コントロールは、ユーザーが特定のトリガー ポイントに触れてから「ドラッグ」できる場合にのみ「アクティブ化」されます。

私の質問は、リストビューがイベントを受け取ってスクロールするのを防ぐために onTouchEvent(...) で何ができるかということです。現在、コントロールに触れて把握できますが、指を上下に動かしすぎると、リストビューが引き継いでスクロールを開始し、ビューは ACTION_UP イベントを受け取りません。

これが私の現在のonTouchEventコードです:

if (e.getAction() == MotionEvent.ACTION_DOWN) {

    Log.d("SwipeView", "onTouchEvent - ACTION_DOWN" + e.getX() + " " + e.getY());           
    int midX = (int)(this.getWidth() / 2);
    int midY = (int)(this.getHeight() / 2);

    if (Math.abs(e.getX() - midX) < 100 &&
        Math.abs(e.getY() - midY) < 100) {

        Log.d("SwipeView", "HEY");
        setDragActive(true);

    }

    this.invalidate();
    return true;

} else if (e.getAction() == MotionEvent.ACTION_MOVE) {

    _current[0] = e.getX();
    _current[1] = e.getY();

    this.invalidate();
    return true;

} else if (e.getAction() == MotionEvent.ACTION_UP) {

    _current[0] = 0;
    _current[1] = 0;

    setDragActive(false);

    this.invalidate();
    return true;

}

なんらかの形でイベント階層と関係があると確信しています。

4

2 に答える 2

3

これはまさにあなたが探しているものではないかもしれませんが、アクティビティにキャプチャ機能を実装することは可能です。追加

private View capturedView;
public void setCapturedView(View view) { this.capturedView = view); }

@Override
public boolean dispatchTouchEvent(MotionEvent event) {
    return (this.capturedView != null) ?
        this.capturedView.dispatchTouchEvent(event) :
        super.dispatchTouchEvent(event);
}

あなたのアクティビティに、ビューを onACTION_DOWNと null onに渡すだけACTION_UPです。それは正確にはきれいではありませんが、機能します。ただし、これを行う適切な方法があると確信しています。

于 2012-10-17T09:24:31.437 に答える
2

最終的にこれを行う正しい方法を学びました: requestDisallowInterceptTouchEvent

于 2012-10-25T11:08:15.603 に答える