2

レイアウトは次のようになります。

ここに画像の説明を入力

ビュー 1 は自己定義のレイアウトFlipperLayoutであり、ビュー 2 は拡張された ListViewPinnedHeaderListViewであり、「プルして更新」機能を追加したいと考えています。ビュー 1 は、左または右に反転するためにタッチ イベントをリッスンする必要があります。ビュー 2 にも touch イベントが必要です。問題は、ビュー 1 がタッチ イベントを消費した場合、ビュー 2 がそれを取得できないことです。

ビュー 1 がイベントを消費した後でも、イベントをビュー 2 にディスパッチするにはどうすればよいですか?

4

2 に答える 2

1

次のカスタム レイアウトを検討してください。

class FlingLinearLayout extends LinearLayout {

    private GestureDetector mDetector;

    public FlingLinearLayout(Context context) {
        super(context);
        setOrientation(LinearLayout.VERTICAL);
        OnGestureListener listener = new SimpleOnGestureListener() {
            @Override
            public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
                Log.d(TAG, "onFling vx: " + velocityX + ", vy: " + velocityY);
                if (Math.abs(velocityX) > Math.abs(velocityY)) {
                    String text = (velocityX > 0? "left to right" : "right to left") + " fling";
                    Toast.makeText(getContext(), text, Toast.LENGTH_LONG).show();
                    return true;
                }
                return false;
            }
        };
        mDetector = new GestureDetector(context, listener);
        setBackgroundColor(0xaaff0000);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        //Log.d(TAG, "onTouchEvent " + event);
        // handle own events (initiated in red area)
        mDetector.onTouchEvent(event);
        return true;
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        //Log.d(TAG, "onInterceptTouchEvent " + ev);
        // handle child events
        // note: if you horizontally fling over button its onClick() is not performed
        return mDetector.onTouchEvent(ev);
    }
}

あなたのアクティビティでの使用:

ViewGroup ll = new FlingLinearLayout(this);
Button b;
OnClickListener l = new OnClickListener() {
    @Override
    public void onClick(View v) {
        Button b = (Button) v;
        Log.d(TAG, "onClick " + b.getText());
    }
};
b = new Button(this);
b.setText("first");
b.setOnClickListener(l);
ll.addView(b);
b = new Button(this);
b.setText("second");
b.setOnClickListener(l);
ll.addView(b);
b = new Button(this);
b.setText("third");
b.setOnClickListener(l);
ll.addView(b);
setContentView(ll);
于 2013-06-08T04:22:31.743 に答える
0

タッチ イベントは、イベントが消費されたかどうかを指定するブール値を返します。false を返すだけで、イベントは引き続き子ビューにトンネリングされます。

于 2013-06-07T08:17:45.343 に答える