アプローチ1:匿名の内部型。
faceView.setOnTouchListener(new OnTouchListener(){
public boolean onTouch(View arg0, MotionEvent arg1){
return false;
}
);
これは名前のない宣言であるため、これは匿名です。 OnTouchListener mytouch =
はありません。new OnTouchListener()
という宣言だけがあります。これはインナーです。なぜなら、それは別のクラスの中にあるからです。インタフェースはインプリメンテーションであるため、型です。
これを念頭に置いてください。このアプローチは開発者にとってより便利です。機能は分離されており(一般的には聴取者の宣言によって)、これは容易に管理されます。しかし、この利便性にはコストが伴います。 10個のonClickListenersを持つボタンがあるとします。この方法では、新しい匿名の内部型ごとにガベージコレクションキューがいっそういっぱいになります。
でも問題ありませんか?あんまり。パフォーマンスを1マイクロ秒ごとにシステムから取り出そうとしている場合は、この方法を使用しないでください。しかし、一般的に、これは実行可能です。
アプローチ2:単一継承
public boolean onTouchEvent(MotionEvent event){
return false;
}
あなたは上記を読むと仮定すると、このアプローチは、創造とクリーンアップのためにはるかに低いコストです。インスタンス化されたクラスは1つしかなく、GCキューに追加されたオブジェクトは1つだけです。
これは私が使用しているアプローチであり、しばらく使っています。また、Googleのサンプルソースコードにも記載されています。
しかし、それは完璧ではありません! onTouchEvent
の実装では、次のような探してしまいます。
public void onTouch(Event e){
if (e.equals(View1)){
}else if (e.equals(View2)){
}else if (e.equals(View 3)){
...}
SO
を正直なところ、それは問題ではありません。最高のパフォーマンスを可能にするには、静的なonTouchEventリスナーを使用してください。上記のコストを支払う必要はありませんが、ほとんどの場合、それほど高価ではありません。