検索

ホームページ  >  に質問  >  本文

Android布局中同级节点的触摸事件传递顺序

一般的触摸事件传递顺序是ViewGroupRoot -> ViewGroupA -> View这样的。现在如果ViewGroupRoot下有两个同级的ViewGroupA和ViewGroupB,且两者宽高均为match_parent,那么请问这时的触摸事件传递顺序是怎样的?ViewGroupA和ViewGroupB谁先收到触摸事件?

伊谢尔伦伊谢尔伦2772日前437

全員に返信(3)返信します

  • 怪我咯

    怪我咯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()

    A または B に elevation または translationZ を設定すると、Z 軸の値が大きい方から View に配分されます。設定されていない View のデフォルト値はこの時点では 0 です。 、インデックスは Order
    1. でのみ追加できます。

      Z 軸の値を設定せず、
    2. を設定して親コントロールの
    3. メソッドを実装した場合、順序はこのメソッドの実装によって決定されます。たとえば、このメソッドのパラメータに 0 を渡すと A のインデックスが返され、1 を渡すと B のインデックスが返されます。実際には A のインデックスが B よりも大きい場合でも、イベントは A に渡されます。まずは

    4. 何もせずに通常どおり使用する場合、配布順序は XML 内のサブコントロールの順序の 逆順 になります。つまり、最後に追加されたものが次になります。実際、2 つのコントロールが重なっている場合、表示されているのは後から追加されたコントロールでもあるため、当然、クリック イベントは後から追加されたコントロールにも配信されます

    大まかに説明するとこんな感じです。間違っていたらご指摘ください。

    返事
    0
  • 巴扎黑

    巴扎黑2017-04-17 17:43:57

    これはランダムだと思います (推測)。この種の問題はログに記録するかデバッグすればわかります。

    返事
    0
  • 巴扎黑

    巴扎黑2017-04-17 17:43:57

    あなたの説明によると、上のものが最初にタッチイベントを取得します。上のものがそれを処理しない場合、それは下のビューグループに渡されます。

    返事
    0
  • キャンセル返事