android.view.View からクラスを派生させると、タッチ イベントを処理する 3 つの可能性が見えます。
- setOnTouchListener メソッドを使用してリスナー インスタンスを追加します。
- View.onTouchEvent メソッドをオーバーライドする
派生ビューで 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 (および 3) は適切ですか?
おまけの質問: View は OnTouchListener インターフェイスを実装していませんが、onTouchEvent メソッドを持っています。なんで?onTouchEvent メソッドを使用する代わりに、ビューがこのインターフェイスを実装する方が一貫性があると思いませんか?
PS: この問題に関する議論を見つけました:
Android onTouchListener はどこに実装すればよいですか?
率直に言って、私は受け入れられた答えを理解していません: "edthethird" は onTouchEvent のオーバーライドについて書きました:
インスタンス化された余分なクラスは 1 つだけです...
どの追加クラス - 表示されません。
onTouchEvent の実装では、彼はイベントをビューと比較していますが、これは私にはあまり意味がありません。さらに、彼はさまざまなビューが onTouchEvent を呼び出すと想定していますが、オーバーライドのアプローチを正しく理解していれば、これは発生しません。
--
「BeatingToADifferentRobot」は、「... setOnTouchListener [..] はより柔軟性を提供し、一般的な Java パターンに従います」と書いています。
私はこれに従うことができません。これ以上の柔軟性はありません。いつでもクラスから派生させ、メソッドをオーバーライドできます。
そして、メソッドをオーバーライドすることは、「一般的なJavaパターンに従わない」ものではないことを願っています