以下のようなViewがあったとする。
Clickできる箇所は、外側の白い部分(下図のA)と、上の水色の部分(下図のB)。残りはnon clickable。すべてのViewのbackgroundDrawableは、stateful(pressedステートだと色が暗くなる)とする。
Android 4.1以降では、子にもpressedステートが伝わる
Android4.1以降でAをクリックした場合は、Aの領域すべてが暗くなる(子にもpressedステートが伝わる)。ただしclickableなBには伝わらない。
Android4.1以降でBをクリックした場合は、Bの領域が暗くなる(Bの中にあるnon clickableな子にもpressedステートが伝わっている)。
Android 4.0以前では、子にpressedステートが伝わらない
一方、Android4.0でAをクリックした場合。子にpressedステートが伝わっていないので、子の色が変わらない。
Android4.0でBをクリックした場合。同様にBの中にある子の色は変わっていない。
なぜ動作が違うか
おそらく関係しているのはView.javaのこのcommit。
変更後は、ACTION_DOWNでsetPressed()が呼ばれるようになった。setPressed()が呼ばれるとdispatchSetPressed()が呼ばれ、そこから子のViewのsetPressed()が呼ばれる。
0 件のコメント:
コメントを投稿