1. 程式人生 > >android開發 -- 檢視和陰影 詳解(Material Design)

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值 (高度)

2.新增一個背景或者outline (即陰影的形狀)


*******************************************************************


       === 下面詳細介紹 ===


View的大小位置都是通過x,y確定的,現在有了z軸的概念,

而這個z值就是View的高度(elevation),而高度決定了陰影(shadow)的大小


1.  View Elevation(檢視高度)


View的z值由兩部分組成,elevationtranslationZ(它們都是Android L新引入的屬性)


eleavation是靜態的成員:設定該元件“浮”起來的高度

translationZ是用來做動畫:設定該元件在Z方向(垂直螢幕方向)上的位移

Z(陰影大小) = elevation + translationZ


在layout中使用屬性去定義

 android:elevation="10dp"    ;     android:translationZ="10dp"

在java程式碼中使用

 View.setElevation(float)    ;    View.setTranslationZ(float) 


新的ViewPropertyAnimator.zViewPropertyAnimator.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動畫,動畫篇會介紹)。




【本文轉自,我稍作了修改】http://blog.csdn.net/a396901990/article/details/40153035