一般的触摸事件传递顺序是ViewGroupRoot -> ViewGroupA -> View这样的。现在如果ViewGroupRoot下有两个同级的ViewGroupA和ViewGroupB,且两者宽高均为match_parent,那么请问这时的触摸事件传递顺序是怎样的?ViewGroupA和ViewGroupB谁先收到触摸事件?
怪我咯2017-04-17 17:43:57
ログやデバッグの際、結果だけが分かりますが、理由は分かりません。
タッチイベントの配信順序のロジックは、dispatchTouchEvent()
メソッド内にある必要があります。親コントロールのこのメソッドの実装が変更された場合、順序は変更される可能性があります。ただし、通常は変更されないため、< の実装のみを確認します。 🎜> とソース コードを見つけるのは簡単です。イベントを子コントロールに渡すコードの部分は、基本的な変数の名前が子として表示され、キー ロジックは次の行になります。ViewGroup
リーリー
が定義されていることがわかります。これはイベントが渡されるサブコントロールです。もちろん、イベントが配布される前にいくつかの判断が行われます。ここでは気にしません。final View child
のインスタンスを決定するロジックは child
です。final View child = (preorderedList == null) ? children[childIndex] : preorderedList.get(childIndex);
、
、preorderedList
の 2 つの主要なパラメーターがこの時点で基本的に決まります。この2つのパラメータで決まります。childIndex
を見てください。メソッド preorderedList
が呼び出されます。子コントロールに elevation または translationZ を設定していない場合は、空の値が返されます。設定すると、buildOrderedChildList()
Z 軸 に従ってソートされたリストが返されます。Z 軸の値を設定すると、Z 軸の値が大きくなるほど、値が大きくなります。優先イベントは配布されます。
を見てください。通常、この値は XML ファイルで定義された順序です。ただし、<を設定すると、メソッド childIndex
および getChildDrawingOrder()
を使用してサブコントロールの描画順序をカスタマイズできます。 🎜> の場合、setChildrenDrawingOrderEnabled(boolean enabled)
は setChildrenDrawingOrderEnabled(true)
を返します。これにより、isChildrenDrawingOrderEnabled()
が null の場合に true
変数 customOrder
が になり、その後、preorderedList
メソッドが呼び出されて現在のオブジェクトの子を取得します。イベント配布。
true
要約すると、クリックした領域には 2 つのビュー A と B があります。それらは同じサイズで、位置が重なっていますgetChildDrawingOrder()
。
何もせずに通常どおり使用する場合、配布順序は XML 内のサブコントロールの順序の 逆順 になります。つまり、最後に追加されたものが次になります。実際、2 つのコントロールが重なっている場合、表示されているのは後から追加されたコントロールでもあるため、当然、クリック イベントは後から追加されたコントロールにも配信されます
大まかに説明するとこんな感じです。間違っていたらご指摘ください。