3

指でパスを描くことができるカスタム ビューを作成しました。View クラスを拡張します。

ユーザーがカスタムビューに触れた場合、ListView内でそれをアイテムの1つとして使用すると、ListViewがスクロールされます。どうすればこれを防ぐことができますか?

どうにかしてカスタム ビューにフォーカスする必要があると思います。しかし、方法がわかりません。

アップデート:

可能な解決策を見つけました。カスタム ビューのonTouchEvent(Motion event)メソッドにgetParent().requestDisallowInterceptTouchEvent(true);.

これがないと、ユーザーがカスタム ビューに触れたときのイベント キューは次のようになります。

  1. MotionEvent.ACTION_DOWN
  2. MotionEvent.ACTION_MOVE
  3. MotionEvent.ACTION_MOVE
  4. MotionEvent.ACTION_CANCEL

MotionEventコードを受け取るとMotionEvent.ACTION_CANCELListViewスクロールが始まります。

4

2 に答える 2

2

requestDisallowInterceptTouchEvent(true)子のonTouch(View, MotionEvent)メソッド内での設定は機能します:

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        ViewGroup item = (ViewGroup) inflater.inflate(R.layout.list_item, null);
        Button button = (Button)item.findViewById(R.id.list_item_btn);
        button.setText("button " + position);

        button.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                listView.requestDisallowInterceptTouchEvent(true);
                return false;
            }

        });

        return item;
    }
于 2014-03-31T11:52:43.833 に答える
0

ListView ウィジェットも拡張する必要があると思います。

あなたが言うように、カスタムビューをタッチすると、リストビューがスクロールします。
カスタムビューに触れると、ビュー階層に沿ってタッチイベントがディスパッチされ
ます。リストビューがタッチイベントを食べる可能性があると思います。
そのため、カスタムビューはタッチイベントを受け取ることができません。
タッチイベントのディスパッチを理解していない場合。
あなたはこれを読むことができますViewGroupでのタッチイベントの管理

やっと。
ListView を拡張してonInterceptTouchEvent()メソッドをオーバーライドすることをお勧めします。あなたの ListView がonInterceptTouchEvent()
でタッチ イベントを処理するかどうかを決定できます。 タッチがdrawPathViewによって処理されるべきであると判断した場合 、ListViewにそれをインターセプトさせないようにすることができます。 したがって、 drawPathView は toch イベントを取得できます。 また、listViewはスクロールしません



于 2013-10-04T03:44:03.990 に答える