1

android.view.View からクラスを派生させると、タッチ イベントを処理する 3 つの可能性が見えます。

  1. setOnTouchListener メソッドを使用してリスナー インスタンスを追加します。
  2. View.onTouchEvent メソッドをオーバーライドする
  3. 派生ビューで OnTouchListener を実装する

    class ExtendedView extends View {
        public ExtendedView(Context context) {
            super(context);
    
            // 1. set a listener
            setOnTouchListener(new OnTouchListener() {
    
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    // TODO Auto-generated method stub
                    return false;
                }
            });
        }
    
        // 2. override onTouchEvent
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            // TODO Auto-generated method stub
            return super.onTouchEvent(event);
        }
    }
    
    
    // 3. implement and use OnTouchListener
    class ExtendedView3 extends View implements OnTouchListener {
    
        public ExtendedView3(Context context) {
            super(context);
            setOnTouchListener(this);
        }
    
        // not override this 
        // public boolean onTouchEvent() {...}
    
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // TODO Auto-generated method stub
            return false;
        }
    }
    

これらの代替手段は同じ目的を果たしているようです。唯一の明らかな違いは、OnTouchListener を使用する場合の追加の View パラメータです。そのため、さまざまなビューをリッスンできます (この場合、非匿名リスナーが使用されます)。しかし、これは私のシナリオでは必要ありません。ExtendedView のインスタンスのイベントをリッスンしたいだけです。

私は使用します-ある程度成功しました-代替2、onTouchEventをオーバーライドします。既存のメソッドをオーバーライドすることは、タスクを達成するための自然で最も簡単な方法のように思えます。

私がここにいる理由: ビューの派生クラスが、onTouchEvent をオーバーライドする代わりに、setOnTouchListener を使用して追加のリスナーを設定するコードを見てきました。

だから私の質問は:

  1. 私は何かが恋しいですか?
  2. ビューから派生する場合、代替案 1 (および 3) は適切ですか?

おまけの質問: View は OnTouchListener インターフェイスを実装していませんが、onTouchEvent メソッドを持っています。なんで?onTouchEvent メソッドを使用する代わりに、ビューがこのインターフェイスを実装する方が一貫性があると思いませんか?


PS: この問題に関する議論を見つけました:

Android onTouchListener はどこに実装すればよいですか?

率直に言って、私は受け入れられた答えを理解していません: "edthethird" は onTouchEvent のオーバーライドについて書きました:

インスタンス化された余分なクラスは 1 つだけです...

どの追加クラス - 表示されません。

onTouchEvent の実装では、彼はイベントをビューと比較していますが、これは私にはあまり意味がありません。さらに、彼はさまざまなビューが onTouchEvent を呼び出すと想定していますが、オーバーライドのアプローチを正しく理解していれば、これは発生しません。

--

「BeatingToADifferentRobot」は、「... setOnTouchListener [..] はより柔軟性を提供し、一般的な Java パターンに従います」と書いています。

私はこれに従うことができません。これ以上の柔軟性はありません。いつでもクラスから派生させ、メソッドをオーバーライドできます。

そして、メソッドをオーバーライドすることは、「一般的なJavaパターンに従わない」ものではないことを願っています

4

0 に答える 0