質問: translationZとelevationの動作の仕方がよくわからなくなったので教えてください。 この2つを使うことでviewにZ軸を指定する。 それにより、影を出すことができるというのがわかりました。 #### 確認したい点 elevationは静的コンポーネント、translationZは動的コンポーネントとなっていて、 elevationでデフォルトの高さを決めることができる。 translationZはアニメーションの時使うといい。 Z=elevation+translationとなっている。 #### わからない点 1.activity_main.xmlで指定する時はelevationを使うほうがいい? 2.animationでのtranslationZの使い方 3.プログラムで作ってみたとき、よくわからない動作をしたので、教えてもらいたいです。 プレビュー画面と実行画面が違うこと どのような基準でviewが上に来ているか ``` ``` プレビュー画面 ![プレビュー画面](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/1fff040a42c25c5312ffa56dddf9a0ce.png) 実行画面 ![実行画面](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/0a41a9f845470d58b4635090f91a26e2.png) わかりづらいかもしれませんがよろしくお願いします。
回答: > > 1. activity_main.xmlで指定する時はelevationを使うほうがいい? > > 2. animationでのtranslationZの使い方 > > > そうですね、明確な基準はありませんがレイアウトxml内でz位置を指定したい場合はelevationを使った方がよいです。elevationで指定した位置を基準にして、プログラムやanimation側でz位置をずらしたい場合にtranslationZを使うべきでしょう。 animationでのtranslationZの使い方については、後述するButtonのanimatorリソースが参考になると思います。 > > 3. プレビュー画面と実行画面が違う > > > これは実行時にButtonのz位置指定が反映されていないことによるものです。API21以降ではButtonの `android:stateListAnimator` 属性にz位置を変更するanimatorリソースが指定されているので、 elevationやtranslationZを指定しても上書きされてしまって反映されません。 リソースファイルの内容によれば、Buttonのz位置は非選択状態では `elevation 2dp + tranlationZ 0dp => 2dp` となるので、他のTextViewよりも下になってしまい表示されなくなってしまっています。 レイアウトプレビュー画面は実行時の状態を完全に再現するものではないので、誤ってレイアウト側のelevationなどの値が優先されてしまい上に表示されているものと思います。 参考: