Android Material Design庫用法舉例

Material Design

Android 5.0 Lollipop版本加入了Material Design庫寺鸥,通過這個庫,開發(fā)人員可以輕松實現體現了Material Design風格的界面開發(fā)。本文將通過示例講解該庫里面常用的一些控件的使用方法秘血,包括:
TextInputLayout,FloatingActionButton评甜,Snackbar灰粮,CoordinatorLayout等。

Github Demo 地址

TextInputLayout
通過將傳統(tǒng)的Edittext用TextInputLayout包裹起來忍坷,可以使得在用戶輸入的時候hint信息懸浮在輸入框上方粘舟,隨時提醒用戶當前輸入的內容是什么,效果如下圖:

TextInputLayout

使用很簡單:

<android.support.design.widget.TextInputLayout    
    android:layout_width="wrap_content"    
    android:layout_height="wrap_content">    

    <EditText        
        android:layout_width="200dp"        
        android:layout_height="wrap_content"        
        android:hint="Input your name here"/>

</android.support.design.widget.TextInputLayout>

其hint顏色佩研,下劃線默認顏色柑肴,高亮顏色,懸浮hint顏色等都可以設置旬薯,具體設置在res/values/styles.xml中晰骑,在當前app使用的Theme里設置:

<resources>    
    <!-- Base application theme. -->    
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">        
        <!-- Customize your theme here. -->        
        <item name="colorPrimary">@color/colorPrimary</item>        
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>        
        <item name="colorAccent">@color/blue</item>        
        <item name="android:textColorHint">@color/gray</item>        
        <item name="colorControlNormal">@color/black</item>        
        <item name="colorControlActivated">@color/yellow</item>        
        <item name="colorControlHighlight">@color/green</item>    
    </style>
</resources>    

其中textColorHint代表hint的顏色,colorControlNormal代表下劃線沒有獲取焦點的顏色绊序,colorControlActivated/colorControlHighlight代表了獲取焦點或者點擊的時候下劃線的顏色硕舆。其他各種名稱和代表的color如下圖所示:


theme顏色說明

FloatingActionButton

FloatingActionButton是界面上的一個懸浮按鈕,用來指示界面上的某個操作骤公,界面下所示抚官。

FloatingActionButton

可以通過anchor指定以哪個控件為基準,并用anchorGravity屬性指定和基準控件的對齊方式阶捆,來將它放在界面上的某個位置凌节。

<android.support.design.widget.FloatingActionButton    
    android:id="@+id/fab"    
    android:layout_width="wrap_content"    
    android:layout_height="wrap_content"    
    android:layout_margin="@dimen/fab_margin"    
    app:layout_anchor="@id/collapsing_toolbar_layout"    
    app:layout_anchorGravity="bottom|end"    
    app:srcCompat="@android:drawable/ic_dialog_email" />

添加響應事件:

FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
}

snackbar
Snackbar是類似于toast的提醒類型的消息,展示在界面底部洒试,可以滑動刪除刊咳。除了展示文字提示外,還可以添加一個action進行一些操作儡司。

Snackbar.make(view, "這里是展示的文字", Snackbar.LENGTH_SHORT)        
    .setAction("Action", new View.OnClickListener() {            
        @Override            
        public void onClick(View view) {        
            // do something       
         }
    ).show();
SnackBar樣式

CoordinatorLayout
CoordinatorLayout繼承自ViewGroup娱挨,是一個加強版的FrameLayout。它有兩個主要作用:

  1. 提供了一種實現MaterialDesign樣式的簡單布局
  2. 在該布局內的元素可以實現UI交互

利用CoordinatorLayout可以實現類似知乎的ToolBar隨頁面滑動而隱藏或展示捕犬,以及ToolBar折疊的效果跷坝。

ToolBar隱藏效果
ToolBar隱藏效果

使用下面的xml實現上面Toolbar隨RecyclerView滑動而隱藏或展示的效果酵镜。

<android.support.design.widget.CoordinatorLayout 
    ...    
    android:layout_width="match_parent"    
    android:layout_height="match_parent"    
    android:fitsSystemWindows="true">    

    <android.support.design.widget.AppBarLayout        
        android:layout_width="match_parent"        
        android:layout_height="wrap_content"        
        android:theme="@style/AppTheme.AppBarOverlay">        

        <android.support.v7.widget.Toolbar            
            android:id="@+id/toolbar"            
            android:layout_width="match_parent"            
            android:layout_height="?attr/actionBarSize"            
            app:layout_collapseMode="parallax"            
            app:layout_scrollFlags="scroll|enterAlways"/>    
    </android.support.design.widget.AppBarLayout>    

    <android.support.v7.widget.RecyclerView        
        android:id="@+id/recycler_view"        
        android:layout_width="match_parent"        
        android:layout_height="match_parent"        
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />
    ...
</android.support.design.widget.CoordinatorLayout>

這里有三個要點:

  1. 將Toolbar包裹在AppBarLayout里,CoordinatorLayout作為最外層layout柴钻。
  2. 指定Toolbar的layout_scrollFlags屬性為"scroll | enterAlways"
  3. 同時給RecyclerView指定behavior屬性為系統(tǒng)內置的“appbar_scrolling_view_behavior”
    這樣就能實現CoordinatorLayout里面組件互相配合的效果淮韭。
Toolbar折疊效果
Toolbar折疊效果

使用下面的xml實現Toolbar折疊效果:

<android.support.design.widget.CoordinatorLayout   
    ...
    android:layout_width="match_parent"    
    android:layout_height="match_parent"    
    android:fitsSystemWindows="true" >

    <android.support.design.widget.AppBarLayout    
        android:layout_width="match_parent"    
        android:layout_height="192dp"    
        android:theme="@style/AppTheme.AppBarOverlay">    

        <android.support.design.widget.CollapsingToolbarLayout        
            android:id="@+id/collapsing_toolbar_layout"        
            android:layout_width="match_parent"        
            android:layout_height="match_parent"        
            app:layout_scrollFlags="scroll|exitUntilCollapsed"        
            android:background="@drawable/girl">        

            <android.support.v7.widget.Toolbar            
                android:id="@+id/toolbar"            
                android:layout_width="match_parent"           
                android:layout_height="?attr/actionBarSize"            
                app:layout_collapseMode="parallax" />    
            </android.support.design.widget.CollapsingToolbarLayout>
    </android.support.design.widget.AppBarLayout>

    <android.support.v7.widget.RecyclerView    
        android:id="@+id/recycler_view"    
        android:layout_width="match_parent"    
        android:layout_height="match_parent"    
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />
    ...
</android.support.design.widget.CoordinatorLayout>

相比于Toolbar隱藏效果婉商,折疊效果的實現有以下幾個要點:

  1. 需要在Toolbar外面先包裹一層CollapsingToolbarLayout渤早,然后在被AppBarLayout包裹
  2. 給CollapsingToolbarLayout設置layout_scrollFlags屬性為"scroll | exitUntilCollapsed"
  3. 指定Toolbar的layout_collapseMode屬性為"parallax"
FooterView的隱藏和展示效果

下面是FooterView隱藏和展示效果,向上滑動RecyclerView時評論布局隱藏休傍,下滑時展示毫蚓。


FooterView隱藏和展示

評論部分的布局如下:

<LinearLayout    
    android:id="@+id/footer_layout"    
    android:layout_width="match_parent"    
    android:layout_height="60dp"    
    app:layout_anchor="@id/recycler_view"    
    app:layout_anchorGravity="bottom"    
    android:background="@color/yellow"    
    app:layout_behavior=".FooterBehavior"    
    android:visibility="gone"    
    tools:visibility="visible">    

    <EditText        
        android:layout_width="0dp"        
        android:layout_height="wrap_content"        
        android:layout_weight="1"        
        android:hint="添加評論"        
        android:layout_margin="10dp"/>    

    <Button        
        android:layout_width="wrap_content"        
        android:layout_height="wrap_content"        
        android:text="發(fā)布評論"/>
</LinearLayout>

為了讓FooterView響應RecyclerView滑動事件占键,我們指定layout的layout_behavior屬性值為FooterBehavior。它是我們自定義的一個Behavior元潘,Behavior是一種CoordinatorLayout內部元素進行交互的方式畔乙,我們可以根據需要實現自己的Behavior,實現特定的交互效果翩概。

public class FooterBehavior extends CoordinatorLayout.Behavior<View> {    
    private boolean visible = false;    
    public FooterBehavior(Context context, AttributeSet attrs) {        
        super(context, attrs);    
    }    

    @Override    
    public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) {        
        return dependency instanceof RecyclerView;    
    }    

    @Override    
    public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) {        
        return true;    
    }    

    @Override    
    public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, View child, View directTargetChild, View target, int nestedScrollAxes) {        
        return true;    
    }    

    @Override    
    public void onNestedScroll(CoordinatorLayout coordinatorLayout, View child, View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) {        
        if (dyConsumed > 0 || dyUnconsumed > 0) {            
            moveOupAnimation(child);        
        }
    }    

    @Override    
    public boolean onNestedFling(CoordinatorLayout coordinatorLayout, View child, View target, float velocityX, float velocityY, boolean consumed) {        
        if (velocityY < -0.5) {            
            moveInAnimation(child);        
        } else {            
            moveOupAnimation(child);        
        }        

    return super.onNestedFling(coordinatorLayout, child, target, velocityX, velocityY, consumed);    
    }
    ...
}    

這里有幾個要點:

  1. 要重寫B(tài)ehavior(context, attrs)這個構造函數牲距,否則通過反射調用Behavior時會出錯
  2. 重寫layoutDependsOn函數,指定當前view所依賴的view钥庇,這里可以是依賴某種類型的view牍鞠,如代碼中所示依賴RecyclerView;也可以是依賴某一個特定的View评姨,根據view的id進行判斷
  3. 根據自己的實際需求皮服,在所依賴的RecyclerView的onStartNestedScroll事件和onNestedFling中,加入對view本身的處理

這里實現FooterView的動畫效果代碼如下参咙,關于動畫的實現技術可以參考我的這篇文章

private void moveInAnimation(View v) {    
    if (!visible) {        
        v.setVisibility(View.VISIBLE);        
        ObjectAnimator moveTopAnim = ObjectAnimator.ofFloat(v, "translationY", v.getHeight(), 0);        
        moveTopAnim.setDuration(300);        
        moveTopAnim.start();        
        visible = true;    
    }
}

private void moveOupAnimation(View v) {    
    if (visible) {        
        ObjectAnimator moveTopAnim = ObjectAnimator.ofFloat(v, "translationY", 0, v.getHeight());        
        moveTopAnim.setDuration(300);        
        moveTopAnim.start();        
        visible = false;    
    }
}

Github Demo 地址

參考:
https://android-developers.googleblog.com/2015/05/android-design-support-library.html

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市硫眯,隨后出現的幾起案子蕴侧,更是在濱河造成了極大的恐慌,老刑警劉巖两入,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件净宵,死亡現場離奇詭異,居然都是意外死亡裹纳,警方通過查閱死者的電腦和手機择葡,發(fā)現死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來剃氧,“玉大人敏储,你說我怎么就攤上這事∨蟀埃” “怎么了已添?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵妥箕,是天一觀的道長。 經常有香客問我更舞,道長畦幢,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任缆蝉,我火速辦了婚禮宇葱,結果婚禮上,老公的妹妹穿的比我還像新娘刊头。我一直安慰自己黍瞧,他們只是感情好,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布芽偏。 她就那樣靜靜地躺著雷逆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪污尉。 梳的紋絲不亂的頭發(fā)上膀哲,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天,我揣著相機與錄音被碗,去河邊找鬼某宪。 笑死,一個胖子當著我的面吹牛锐朴,可吹牛的內容都是我干的兴喂。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼焚志,長吁一口氣:“原來是場噩夢啊……” “哼衣迷!你這毒婦竟也來了?” 一聲冷哼從身側響起酱酬,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤壶谒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后膳沽,有當地人在樹林里發(fā)現了一具尸體汗菜,經...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年挑社,在試婚紗的時候發(fā)現自己被綠了陨界。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡痛阻,死狀恐怖菌瘪,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情阱当,我是刑警寧澤麻车,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布缀皱,位于F島的核電站,受9級特大地震影響动猬,放射性物質發(fā)生泄漏啤斗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一赁咙、第九天 我趴在偏房一處隱蔽的房頂上張望钮莲。 院中可真熱鬧,春花似錦彼水、人聲如沸崔拥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽链瓦。三九已至,卻和暖如春盯桦,著一層夾襖步出監(jiān)牢的瞬間慈俯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工拥峦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留贴膘,地道東北人。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓略号,卻偏偏與公主長得像刑峡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子玄柠,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,756評論 25 707
  • 內容抽屜菜單ListViewWebViewSwitchButton按鈕點贊按鈕進度條TabLayout圖標下拉刷新...
    皇小弟閱讀 46,727評論 22 665
  • 最近做了一個Android UI相關開源項目庫匯總突梦,里面集合了OpenDigg 上的優(yōu)質的Android開源項目庫...
    OpenDigg閱讀 17,174評論 6 223
  • http://www.daqianduan.com/2857.html html5學得好不好,看掌握多少標簽 ht...
    棟棟曉閱讀 195評論 0 0
  • 對于能隨便把一個日子過出戀愛酸臭味的小情侶們來說,七夕無疑是最佳秀恩愛的好機會铐伴,只是可惜了我們這些單身貴族們,既要...
    半個格子閱讀 554評論 0 1