最近面接の準備をしています。たくさん見直しました。最も単純な言葉を使って、過去から学んだ新しい知識ポイントを表現します。一つは録音することです。第二に、それが皆を助けることができれば、より良い
1.イベント配信の3つの重要な方法
まず、ランダムにViewGroupを作成しました。3つの重要なメソッドは
- dispatchTouchEvent
- onInterceptTouchEvent
- onTouchEvent
public class MyViewGroup extends ViewGroup {
//...省略部分代码
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
return super.dispatchTouchEvent(ev);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return super.onInterceptTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return super.onTouchEvent(event);
}
}
次に、これら3つの方法について簡単に説明します。
方法 | 効果 | 呼び出し時間 |
---|---|---|
dispathTouchEvent() | クリックイベントの配信(配信) | クリックイベントが現在のビューに渡されると、メソッドが呼び出されます。 |
onInterceptTouchEvent() | イベントがインターセプトされるかどうかを決定します(ViewGroupでのみ、通常のビューにはこのメソッドがありません)。 | dispathTouchEvent()内で呼び出されます |
onTouchEvent() | クリックイベントの処理 | dispathTouchEvent()内で呼び出されます |
イベント配信の順序は、Activity(Window)-> ViewGroup-> Viewです。
2.動きを拡大し、イベント配布プロセスを分析します。
写真の中の:
- super:親メソッドを呼び出す
- true:消費イベント、つまり、イベントは引き継がれません
- false:イベントは消費されず、イベントは引き継がれず、処理のために親コントロールのonTouchEvent()に渡されません。
上の図を見てください。分析は次のとおりです。合計3つのステップがあります。
ステップ1(アクティビティ中):
アクティビティの最初のdispatchTouchEvent()イベント
が値を返します:
true / false ------->消費イベント(ここではfalseも消費イベントです)
スーパー------------->イベントが発行されますViewGroupに移動し、ViewGroupのdispatchTouchEvent()を呼び出します
ステップ2(ViewGroup内)
ViewGroup内
のイベントのdispatchTouchEvent()戻り値:
true -------------->消費イベント
false ------------->イベントは消費されません。親コントロールのonTouchEvent()に送信して、
スーパーを処理します------------->イベントは、現在のViewGroupのonInterceptTouchEvent()に送信されます
ViewGroup内
のイベントonInterceptTouchEvent()の戻り値:
true -------------->イベントは現在のViewGroupのonTouchEvent()に配信されます
false / super ----->イベントは子ビュー、子ビューのdispatchTouchEvent()を呼び出す
ViewGroup内のイベントのonTouchEvent()の
戻り値:
true --------------> Consumption event
false / super ----->イベントは消費されず、送信もされず、親コントロールに渡されます。 OnTouchEvent()の処理
ステップ3(子ビューで)
ビュー
のイベントのdispatchTouchEvent()戻り値:
true -------------->消費イベント
false ------------->イベントは消費されず、ダウンされません親コントロールのonTouchEvent()に送信して、
スーパーを処理します------------->イベントは現在のビューのonTouchEvent()に送信されます
ビュー内
のイベントのonTouchEvent()戻り値:
true -------------->消費イベント
false /スーパー----->イベントを消費せず、親コントロールにも送信しません。 OnTouchEvent()の処理