Libraryなるものが発表されましたが、皆さん使ってみましたでしょうか?“SupportDesignは単体のモジュールなのにTheme.AppCompatなしじゃまともに動かずAppCompatとがんじがらめ”とか“FloatingActionButtonがAPI15,16だと四角く表示される”(app:borderWidth=”0dp”を追加したら直るよ!)とか“AppBarLayoutが完全に隠れた状態でActivityのライフサイクルが走ると復帰時に真っ白になる”などなど、いきなり色々怪しいところがありますが、マテリアルデザインを実現するウィジェットが比較的楽に導入できるので僕は概ね気に入ってます。AppBarLayoutは素晴らしく、このレイアウトを使うとスクロールと連動してToolbarの表示を動的に切り替えてくれてルック&フィールが素晴らしくなります(一応SupportDesignが出る前も存在したけど使い勝手がめっちゃ悪く実質オープンソース頼りでした)ただそのAppBarLayoutでどうしても納得行かないことがあり...Lollipop未満の端末でAppBarLayoutに影が付かない!見た目重視のために使おうとする機能なのに、いざ実装してみたら見た目が残念とか洒落にならなくないでしょうか。Lollipop未満って世に出回ってるスマホの9割が該当するんですが!症状としてはこんな感じです↓と言っても影の表現自体、マテリアルデザインで導入された概念なんでLollipop未満の端末は知らんがなって言われたらそれまでなんですが...。追加されたFloatingActionButtonなんかは一応、KitKatまでの端末でもちゃんと影を表示してくれてるんですね。(一応って書いたのは”app:borderWidth=0dp”にした時にしか影が出てこないという謎仕様のためなんですが、話がズレそうなのでここではスルーします。影は出るんです!)しかもAppBarLayoutと言えば、実質ActionBarの役割を果たすレイアウトでもあるので影の表現はかなり重要です。なんてったって今までActionBarはデフォルトのスタイルが影有りでしたから。いうことで前置きが長くなったんですが、今回はAppBarLayoutに影を追加する方法を探ってみました。原因を探るまずAppBarLayoutのソースを見てみることにしました。this.mTargetElevation);Elevationをセットしてるだけでした。ElevationはLollipop以降でしか機能しないのでKitkatまでの端末で動かないのは当たり前です。これはAppBarLayoutが特殊というわけではなく、他のViewも全部そうです。this.mPressedTranslationZ);this.mShadowDrawable.setAddPaddingForCorners(false);this.mShadowViewDelegate.setBackgroundDrawable(this.mShadowDrawable);ちゃんとやってた!ShadowDrawableっての作って影としてセットしてくれてるんですね。ShadowDrawableWrapperの中見るとしっかりCanvasで描いてました。AppBarLayoutは他のViewと一緒で、ActionBar相当の機能だからといって特別何かやってくれてるわけではないんですね。FloatingActionButtonがちゃっかりし過ぎてるってことなのかもしれません。対策まずおなじみのToolbarに影を付ける方法が使えるか試してみました。ToolbarはそれこそActionBarをフレームワークから切り離しViewとして扱えるようにしたものなんですが、こちらも影が付きません。影が付かないのを気にする開発者は多く、ググると下記のようにToolbarの下に影用のViewを置く回避方法がいっぱいヒットします。/></RelativeLayout>ちなみにLollipop以降はElevationセットするだけでOKです。Elevationの値はかなり細かく定められていて、Toolbarの場合4dpをセットします。shadowsで、この方法をAppBarLayoutにも適用してみようと、まずは単純にAppBarLayoutの中にToolbarと並ぶ感じで影用のViewを入れてみました。</android.support.design.widget.AppBarLayout>影の部分が透過しない!AppBarLayoutがLinearLayoutを継承してるから予想はしてたのでへこたれない。次にAppBarLayout自体をViewGroupで囲んでみました。</LinearLayout>見た目はいけた!でもスクロールと連動してAppBarLayoutが隠れない!CordinatorLayoutの直下に置かないと動かないのかな?力尽きたのでソース調べる気になれず。それならとコンテンツ側をViewGroupで囲って影を常にコンテンツに被せるようにしてみました。</RelativeLayout>上手く動いた!ということでAppBarLayoutに影を付けたい場合は、コンテンツ側を囲むようにしましょうという話でした。