android開發 -- 檢視和陰影 詳解(Material Design)
Material Design包含了很多內容,大致把它分為四部分:
主題和佈局——ANDROID L——Material Design詳解(主題和佈局)
檢視和陰影——ANDROID L——Material Design詳解(檢視和陰影)
UI控制元件——ANDROID L——Material Design詳解(UI控制元件)
動畫——ANDROID L——Material Design詳解(動畫篇)
現在介紹下
檢視和陰影
*******************************************************************
在Android L中設定一個陰影很簡單,只需要兩點:
1.設定eleavation值 (高度)
*******************************************************************
=== 下面詳細介紹 ===
View的大小位置都是通過x,y確定的,而現在有了z軸的概念,
而這個z值就是View的高度(elevation),而高度決定了陰影(shadow)的大小
1. View Elevation(檢視高度)
View的z值由兩部分組成,elevation和translationZ(它們都是Android L新引入的屬性)。
eleavation是靜態的成員:設定該元件“浮”起來的高度,
translationZ是用來做動畫:設定該元件在Z方向(垂直螢幕方向)上的位移。
Z(陰影大小) = elevation + translationZ
在layout中使用屬性去定義
android:elevation="10dp" ; android:translationZ="10dp"
在java程式碼中使用
View.setElevation(float) ; View.setTranslationZ(float)
新的ViewPropertyAnimator.z和ViewPropertyAnimator.translationZ方法可以設定檢視的elevation值
新的屬性值:translationZ允許你建立一個動畫暫時的反應出View的高度值(elevation)變化。
這對於響應觸控手勢很有用處,請看下面程式碼(官方Demo中的程式碼):
int action = motionEvent.getActionMasked();
/* Raise view on ACTION_DOWN and lower it on ACTION_UP. */
switch (action) {
case MotionEvent.ACTION_DOWN:
Log.d(TAG, "ACTION_DOWN on view.");
view.setTranslationZ(120);
break;
case MotionEvent.ACTION_UP:
Log.d(TAG, "ACTION_UP on view.");
view.setTranslationZ(0);
break;
default:
return false;
}
一個簡單觸控監聽,在點選和擡起的時候分別設定translationZ的值,效果如下圖所示:
2. Shadows and Outlines(陰影和輪廓)
檢視的背景邊界 決定了預設的陰影形狀。
輪廓(Outlines)代表了圖形物件的外形狀,並確定了 對於觸控反饋的波紋區域。
////////
在Android L中設定一個陰影很簡單,只需要兩點:
1.設定eleavation值 (高度)
2.新增一個背景或者outline (即陰影的形狀)
//////
方法一:可以在xml中通過定義一個背景來設定outline:
如:
給TextView設定android:background和elevation(高度決定了陰影的大小。)
<TextView
android:id="@+id/myview"
android:layout_width="50dp"
android:layout_height="50dp"
android:elevation="10dp"
android:background="@drawable/myrect" />
然後定義個xml背景outline輪廓(背景輪廓 決定了預設的 陰影形狀):
<!-- res/drawable/myrect.xml -->
<!--設定圓角矩形(其他形狀還有圓形:android:shape="oval",矩形等)-->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#42000000" />
<!--設定圓角大小-->
<corners android:radius="5dp" />
</shape>
當這個背景drawable作為檢視的輪廓,檢視投射出圓角陰影。提供一個自定義的輪廓,可以覆蓋預設檢視陰影的形狀。
注意:若控制元件背景為半透明的shape或圖片,則不會產生陰影,需要通過程式碼設定;
方法二:也可以通過程式碼來建立一個outline輪廓:
1.繼承ViewOutlineProvider類;
2.重寫getOutline()方法 ;
3.在檢視中設定輪廓,使用View.setOutlineProvider()方法;
示例程式碼如下:
ViewOutlineProvider viewOutlineProvider = new ViewOutlineProvider() {
@Override
public void getOutline(View view, Outline outline) {
outline.setOval(0, 0,view.getWidth, view.getHeight); //設定圓形(還有圓角矩形,矩形,path), 後兩個值為該控制元件view高寬(或者自定義數值)
}
};
fab.setOutlineProvider(viewOutlineProvider); //給該控制元件設定輪廓
下圖是使用不同eleavation值產生的陰影效果:
下圖是不同背景/輪廓產生的陰影和拖拽效果:
**************************************************************************************************
3. Drawable Tinting(著色)
對於Android L還有一個獨特的特點就是現在可以定義圖片的alpha遮罩,並且可以輕鬆的使用android:tint屬性去調整色調。
下面是一個使用tint屬性給背景調整不同顏色的例子:
<LinearLayout
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal">
<ImageView
...
android:src="@drawable/xamarin_white"
android:background="@drawable/mycircle"/>
<ImageView
...
android:src="@drawable/xamarin_white"
android:background="@drawable/mycircle"
android:tint="#2C3E50"/>
<ImageView
...
android:src="@drawable/xamarin_white"
android:background="@drawable/mycircle"
android:tint="#B4BCBC"/>
</LinearLayout>
效果圖:
*************************************************************************
4. Clipping Views(裁剪檢視)
可以使用View.setClipToOutline方法去剪下一個檢視的outline區域。
只有rectangle,circle, 和round rectangle outlines支援裁剪(Outline.canClip方法用來判斷是否可以裁剪)
為了裁剪一個可繪製的檢視形狀,需要先設定一個outline然後呼叫View.setClipToOutline方法:
floatingShape.setClipToOutline(true);
下面請看一個使用裁剪的例子:
int margin = Math.min(clippedView.getWidth(), clippedView.getHeight()) / 10;
Outline mClip = new Outline();
mClip.setRoundRect(margin, margin, clippedView.getWidth() - margin,
clippedView.getHeight() - margin, margin / 2);
/* Sets the Outline of the View. */
clippedView.setOutline(mClip);
/* Enables clipping on the View. */
clippedView.setClipToOutline(true);
首先建立一個輪廓,給輪廓設定區域大小,新增輪廓到檢視上,確認裁剪,效果圖如下:
因為裁剪檢視是一個很耗資源的操作,所以當裁剪一個檢視時不要新增動畫(為了達到這個效果可以使用Reveal Effect動畫,動畫篇會介紹)。