天天看點

建立Material Design風格的Android應用--定義陰影和裁剪視圖

之前已經寫過通過應用主題和使用ListView, CardView,應用Material Design樣式,同時都都可以通過support library向下相容。今天要寫的陰影和視圖裁剪,無法向下相容,請注意。

​Material Design 為使用者界面元素引入了深度這個元素。深度幫助使用者了解各個元素之間的重要關聯和幫助使用者關注他們手上的任務。

視圖的高度(elevation),通過Z屬性表現,通過他的陰影确定:z值更高的視圖投影出更大的陰影。視圖隻在Z=0的平面上投影處陰影;他們不會投影陰影在其他放在下面的視圖上面和高于z=0的平面。

有更高Z值的視圖擋住Z值較低的視圖。無論如何,Z值不會影響到View的大小。

高度也是有用的,當在執行一些動作的時候建立動畫讓元件升起。

為視圖配置設定高度

一個View的Z值有兩個組成部分,elevation(高度)和translation(平移).elevation是一個靜态部分,translation 用于動畫:

Z = elevation + translationZ
建立Material Design風格的Android應用--定義陰影和裁剪視圖

不同高度的視圖的陰影

在布局檔案中設定evelation 使用

android:elevation

,在代碼中使用

View.setElevation()

方法。

設定一個視圖的平移,使用View.setTranslationZ()方法。

新的方法

ViewPropertyAnimator.z()

ViewPropertyAnimator.translationZ()

可以讓你更容易的變動視圖的高度。更多的資訊,看ViewPropertyAnimator的Api文檔http://developer.android.com/reference/android/view/ViewPropertyAnimator.html。和屬性動畫的開發指南:http://developer.android.com/guide/topics/graphics/prop-animation.html。

你也可以使用StateListAnimator方式定義這些檔案在xml檔案中。特别适用于,狀态改變時執行的動畫,比如使用者點選按鈕。更多資訊,請看動畫視圖狀态改變,下次在動畫一節講。

Z值在測量上使用和X,Y值一樣的機關。

自定義視圖陰影和輪廓

視圖的背景邊界決定了陰影的預設形狀。輪廓(Outlines)代表了圖形對象的外形狀,并确定了對觸摸回報區的波紋。

看這個視圖,定義一個背景Drawable:

<TextView
    android:id="@+id/myview"
    ...
    android:elevation="2dp"
    android:background="@drawable/myrect" />
           

背景是一個圓角矩形

<!-- 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>
           

當這個背景drawable作為視圖的輪廓,視圖投射出圓角陰影。提供一個自定義的輪廓,可以覆寫預設視圖陰影的形狀。

在自己的代碼中自定義一個輪廓:

1.繼承ViewOutlineProvider類

2.重寫getOutline()方法

3.在視圖中設定輪廓,使用View.setOutlineProvider()方法

你可以建立橢圓和圓角矩形輪廓使用OutLine類中的方法。視圖預設的outline provider會根據視圖的背景來生成輪廓。可以設定視圖的outline provider為null,來阻止投射陰影。

 裁剪視圖

裁剪視圖功能,可以讓你更容易的改變視圖的形狀。你可以裁剪視圖為了和其他的設計元素保持一緻,或者改變成形狀響應使用者的輸入。你可以裁剪一個視圖的輪廓使用

View.setClipToOutLine()

方法,或者

android:clipToOutline

屬性。隻有矩形,圓角矩形,圓圈的輪廓支援被裁剪,可以使用

Outline.canClip()

方法檢測是否支援被裁剪。

裁剪視圖到一個drawable的形狀,設定drawable作為視圖的背景(讓視圖顯示在其上),并且調用

View.setClipToOutline()

方法。

裁剪視圖是一個耗費的操作,裁剪視圖時不要使用形狀動畫。達到這種效果,請使用Reveal Effect 動畫(下節講)。

 總結

上面可以看到,設定陰影很簡單:

  1. 設定eleavation值。
  2. 添加背景或者設定一個outline.

參考資料:http://developer.android.com/training/material/shadows-clipping.html

原文位址:http://blog.isming.me/2014/10/26/creating-app-with-material-design-three-shadows/,轉載請注明出處。