web-dev-qa-db-ja.com

onTouchevent()vs onTouch()

OnTouchEventとonTouchを何度も試してみたところ、インターフェイスを宣言してリスナーを正しく設定している限り、onTouchは(アクティビティまたはビューに関係なく)必要なすべての場所で機能することがわかりました。一方、onTouchEventはビュー内でのみ機能します!私の仮定は正しいですか?これは本当の違いですか?

58
stelios

はい、正しいです-onTouch()sersViewで使用され、onTouchEvent()派生クラスViewのタッチイベントを取得します。

41
trojanfoe

OnTouchEvent()とonTouch()の動作に関連する混乱がありました(この質問に対する私のコメントを見ることができます)。以下のいくつかの研究の後、私はそれを見つけました。これは初心者に役立つかもしれません。

1)実装:

OnTouch()を使用する場合は、3つのことを行う必要があります。

1- OnTouchListenerを実装する

2-設定するビューでsetOnTouchListener()を呼び出し、イベントをキャッチします

3- onTouch()をオーバーライドしてイベントを処理する

ただし、onTouchEvent()を使用する場合は、上記の手順1と2を実行する必要はありません。 onTouchEvent()をオーバーライドする必要があります。

2)作業中:

onTouch()は、ビュー、ビューグループ、アクティビティに対して機能します。つまり、ビュー、ビューグループ、またはアクティビティ内でonTouch()を使用できます。このメソッドは2つの引数[onTouch(View v、MotionEvent e)]を取ります。これにより、アクティビティまたはビューグループのさまざまなビューのイベントをフィルタリングできます。または、アクティビティ自体で処理できます。 onTouchEvent()は1つの引数[onTouchEvent(MotionEvent e)]を取ります。したがって、これは、それを実装するビュー内または派生ビューでのみ使用できます。派生ビューは、タッチの拡張を有効にします。 onTouchEvent()で定義された動作。

このようなオプションは、Androidのより柔軟な開発哲学の一部であると思いますが、それは時々学習者に混乱をもたらします。

29
Dexter

Ontouch()およびontouchevent()を使用しました。ontouchは、単一ビューのボタン、イメージボタンなどの単一ビューの要素(たとえばLinearlayout)で作業したいときに使用されますが、私の要素(ボタンなど)はontoucheventを使用しています。

5
hemantsb

カスタムビューの作成中に、次のことができます

@override onTouchEvent(MotionEvent e){}

一方、onTouchは任意のView、ViewGroup、またはActivityに追加できます。

onTouch(View v, MotionEvent e) { //you can filter any View's touch }

onTouchは汎用で、onTouchEventはViewに固有です。また、onTouchを使用してビューをフィルタリングすることもできます。

4
Xar E Ahmer

OnTouchEvent()は実際にはwillいずれのビューもタッチイベントを消費しない場合、アクティビティによって呼び出されます。

そして、あなたが言うように、onTouch()は次の条件を満たしている限り、どのクラスでも使用できます。

  1. そのクラス(つまりFoo)はOnTouchListenerインターフェイスを実装し、
  2. そのクラスは、view.setOnTouchListener(foo);を使用して登録されたリスナーです
4
paiego

別の違いが見つかりました。 onTouchEventは非推奨のイベントMotionEvent.ACTION_POINTER_2_DOWNおよびMotionEvent.ACTION_POINTER_2_UPを取得していないようです。

もちろん、それらは非常に古いものであり、使用すべきではありません。

これはAndroid 5.1 api 22。

0
Dave Hubbard

onTouchEventViewActivityおよびLinearLayoutetc ..

_public boolean onTouchEvent(MotionEvent event) {
    throw new RuntimeException("Stub!");
}
_

派生クラスによってこのメソッドをオーバーライドできます

一方

onTouch()はインターフェースによって定義されますOnTouchListener {}

public interface OnTouchListener { boolean onTouch(View var1, MotionEvent var2); }

そのため、このインターフェイスをクラスに設定するときに1つだけを実装する必要があります

0
gor