編寫(xiě): allenlsy - 原文: https://developer.android.com/training/material/shadows-clipping.html
Material Design 引入了UI元素深度的概念。深度可以幫助用戶(hù)理解每個(gè)元素的不同重要性,讓用戶(hù)集中注意力做手頭的工作。
視圖的elevation,用 Z 屬性來(lái)表示,它決定了陰影的大?。焊蟮?Z 值可以投射出更大更柔軟的陰影。Z 值較大的視圖會(huì)遮蓋住Z值較小的視圖。不過(guò),Z值大小不會(huì)影響視圖的大小。
陰影是由被投射視圖的上級(jí)視圖來(lái)完成繪制,因此他受上級(jí)視圖影響,附著在上級(jí)視圖上。
Elevation對(duì)于創(chuàng)建臨時(shí)上升這種動(dòng)畫(huà)同樣很有用。
更多信息,請(qǐng)參見(jiàn)3D空間中的對(duì)象。
視圖的 Z 值有兩個(gè)組成部分:
Z = elevation + translationZ
http://wiki.jikexueyuan.com/project/android-training-geek/images/shadows-depth.png" alt="" />
圖1 - 不同深度view的陰影.
在layout中設(shè)置視圖的elevation,要使用android:elevation屬性。要在Activity代碼中設(shè)置elevation,使用View.setElevation()方法。
要設(shè)置視圖的translation,使用View.setTranslationZ()方法。
新的ViewPropertyAnimator.z() 和 ViewPropertyAnimator.translationZ() 方法使你可以很容易的實(shí)現(xiàn)elevation動(dòng)畫(huà)。更多信息,請(qǐng)查看ViewPropertyAnimator和屬性動(dòng)畫(huà)開(kāi)發(fā)指南。
你也可以使用 StateListAnimator 來(lái)聲明動(dòng)畫(huà)。這非常適用于要通過(guò)狀態(tài)改變來(lái)觸發(fā)動(dòng)畫(huà)的情況,比如當(dāng)用戶(hù)按下按鈕。更多信息,請(qǐng)查看Animate View State Changes(當(dāng)視圖狀態(tài)變化的動(dòng)畫(huà),譯者注)。
Z值的計(jì)算單位是dp。
視圖背景的邊界決定了陰影的形狀。輪廓是一個(gè)圖形對(duì)象的外圍形狀,決定了觸摸反饋動(dòng)畫(huà)的ripple區(qū)域。
假設(shè)以下是個(gè)視圖:
<TextView
android:id="@+id/myview"
...
android:elevation="2dp"
android:background="@drawable/myrect" />
背景drawable定義為一個(gè)圓角的矩形:
<!-- res/drawable/myrect.xml -->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#42000000" />
<corners android:radius="5dp" />
</shape>
這個(gè)視圖會(huì)投影出圓角,因?yàn)楸尘癲rawble可以決定視圖輪廓。如果提供一個(gè)自定義的輪廓,會(huì)覆蓋這個(gè)默認(rèn)的陰影形狀。
以下方式可以自定義視圖的輪廓:
ViewOutlineProvider 類(lèi)getOutline() 函數(shù).View.setOutlineProvider() 方法來(lái)設(shè)定視圖的輪廓提供者.使用Outline類(lèi)的函數(shù),你可以創(chuàng)建橢圓和帶圓角的矩形輪廓。視圖的輪廓提供者會(huì)從視圖的背景中獲取輪廓。如果不想讓視圖投射陰影,你可以設(shè)置輪廓提供者為 null。
Clipping 視圖(附著視圖,譯者注)使你輕松的改變視圖的形狀。你可以為了一致性而附著視圖,也可以是為了當(dāng)用戶(hù)輸入信息時(shí),改變視圖的形狀。你可以通過(guò)View.setClipToOutline() 將視圖附著給一個(gè)輪廓,或使用android:clipToOutline屬性。只有矩形、圓形和圓角矩形輪廓支持附著功能,你可以通過(guò)Outlin.canClip()方法來(lái)檢查是否支持附著。
把視圖附著給drawable的形狀,要將這個(gè)drawable設(shè)置為視圖的背景,并調(diào)用View.setClipToOutline() 方法。
附著視圖是一個(gè)昂貴的操作,所以不要對(duì)附著過(guò)的形狀是進(jìn)行動(dòng)畫(huà)。要實(shí)現(xiàn)這個(gè)效果,使用 Reveal Effect 動(dòng)畫(huà)