6

私は Java で Android アプリを作成しています。このアプリでは<TextView>、画面の周りにたくさんあり、すべて onTouchListeners が定義されています。これらは<ScrollView>、画面で使用可能なスペースよりも多くのスペースを占有するため、 で囲まれています。

私の問題は次のとおりです。画面に触れて指を上下に動かしてアプリを上下にスクロールすると、スクロールは期待どおりに機能しますが、タッチされた onTouchListener<TextView>も起動されます(これもおそらく予想されます) -そうなってほしくないけど。画面に触れてスクロールするときに onTouchListener を無視したい。

どうすればこれを達成できますか? ユーザーがスクロールしているときに関数を実行したくなく、「誤って」特定の<TextView>.

4

7 に答える 7

20

さらに検索した後、Stimsoni によるこのソリューションを見つけました。ACTION_DOWNイベントとACTION_UPイベントの間の時間が で指定された値より短いか長いかをチェックするという考え方ですViewConfiguration.getTapTimeout()

ドキュメントから:

[戻り値] タッチ イベントがタップかスクロールかを確認するために待機するミリ秒単位の期間。ユーザーがこの間隔内に移動しない場合は、タップと見なされます。

コード:

view.setOnTouchListener(new OnTouchListener() {

    private long startClickTime;

    @Override
    public boolean onTouch(View view, MotionEvent event) {

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

            startClickTime = System.currentTimeMillis();

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

            if (System.currentTimeMillis() - startClickTime < ViewConfiguration.getTapTimeout()) {

                // Touch was a simple tap. Do whatever.

            } else {

                // Touch was a not a simple tap.

            }

        }

        return true;
    }

});
于 2016-02-11T03:01:14.417 に答える
2

私はあなたと同じ問題を抱えていましたACTION_CANCEL.

motionEvent.getActionMasked()(あなたの場合のACTION_CANCELように)以前に認識されたアクションがACTION_DOWN、スクロールなどの他のジェスチャーによって「キャンセル」された場合と同じです。コードは次のようになります。

view.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View view, MotionEvent e) {
        if (e.getActionMasked() == MotionEvent.ACTION_DOWN) {
            // perceive a touch action.
        } else if(e.getActionMasked() == MotionEvent.ACTION_UP ||
                e.getActionMasked() == MotionEvent.ACTION_CANCEL) {
            // ignore the perceived action.      
        }
    }

これが役立つことを願っています。

于 2016-11-19T20:35:34.410 に答える
0

次のように移動アクションを識別できます。

view.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {

            if(event.getAction() == MotionEvent.ACTION_MOVE)
            {

            }

            return false;
        }
    });
于 2016-02-09T13:31:36.900 に答える