Material Design 常用控件

Material Design

Material Design 是在2014年Google I/O大会上推出的一套全新的界面设计语言。

意在解决Android平台界面风格不统一调的问题。


1.下拉刷新

SwipeRefreshLayout 用来实现下拉刷新

把要实现下拉刷新的控件放置到 SwipeRefreshLayout 中,eg:

       <android.support.v4.widget.SwipeRefreshLayout
            android:id="@+id/activity_main_swipe_refresh"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <ListView
                android:id="@+id/activity_main_lv"
                android:layout_width="match_parent"
                android:layout_height="match_parent"/>
        </android.support.v4.widget.SwipeRefreshLayout>

刷新事件:

    private SwipeRefreshLayout swipeRefresh; //下拉刷新布局

    //下拉刷新
        swipeRefresh = (SwipeRefreshLayout) findViewById(R.id.activity_main_swipe_refresh);
        swipeRefresh.setColorSchemeResources(R.color.colorPrimaryDark); //设置进度条颜色
        swipeRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {

                /**
                 * 更新操作
                */
              
                //当执行完更新操作后,结束刷新事件,隐藏进度条
                //一般写在加载数据方法内
                swipeRefresh.setRefreshing(false);
            }
        });

SwipeRefreshLayout 的 set Refreshing() 方法传入 false,用于表示刷新事件结束,并隐藏刷新进度条

2.Toolbar

优点:继承了ActionBar的所有功能,而且灵活性很高。

Android studio 创建的项目默认是带ActionBar的,我们需要修改 res>values>styles.xml 文件,来不使用ActionBar
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">

布局文件中添加Toolbar:

<android.support.v7.widget.Toolbar
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:background="@color/colorPrimary"
    android:layout_height="?attr/actionBarSize"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>

?attr/actionBarSize :》》 ?attr 表示使用当前样式(主题)中定义的对应属性值,默认值是56dp, 可以点进去看看

android :theme : 》》 toolbar 使用深色主题

app:popupTheme :》》 menu菜单设置为淡色主题 ;app 目的是为了兼容低版本手机

获取实例传入实例 : <u>setSupportActionBar(toolbar) 很重要要不然不显示</u>

        Toolbar toolbar=(Toolbar)findViewById(R.id.toolbar);
        toolbar.setTitle("Title");
        setSupportActionBar(toolbar);

Toolbar 来显示更多内容:

右击res目录 ->New->Directory, 创建一个menu 菜单。右击menu文件夹->New->Menu resource file, 创建一个toolbar.xml文件,并写入如下代码:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto">

    <item
        android:id="@+id/item_back"
        android:icon="@drawable/ic_backup"
        android:title="Backup"
        app:showAsAction="always"/>
    <item
        android:id="@+id/item_delete"
        android:icon="@drawable/ic_delete"
        android:title="Delete"
        app:showAsAction="ifRoom"/>
    <item
        android:id="@+id/item_setting"
        android:icon="@drawable/ic_settings"
        android:title="Setting"
        app:showAsAction="never"/>
</menu>

showAsAction 有以下几种值可以选则:

always表示永远显示在Toolbar中,如果屏幕空间不够则不显示;

if Room表示屏幕空间足够的话显示在Toolbar中,不够的话就显示在菜单当中;

never 则表示永远显示在菜单当中。默认是never。

注意:Toolbar 中的action按钮只会显示图标,菜单中的action按钮只会显示文字

重写 onCreateOptionsMenuonOptionsItemSelected 方法来实现创建菜单和菜单点击事件:

 @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        //MenuInflater 菜单填充器
        getMenuInflater().inflate(R.menu.main,menu);
        return true; //表示是否显示菜单
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        //根据不同的 itemId 执行不同操作
        switch (item.getItemId()){
            case R.id.item_delete:
                toast("You clicked delete!");
                break;
            case R.id.item_setting:
                toast("You clicked setting!");
                break;
        }
        return true;
    }

效果图:
menu菜单.gif

另外还有一个就是Home箭头显示 和 Icon 显示

       //显示Home箭头(返回箭头)
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        
        //设置图标
        getSupportActionBar().setIcon(R.mipmap.ic_launcher);

点击事件:

  @Override
    public boolean onSupportNavigateUp() {
        toast("Back!");
        return super.onSupportNavigateUp();
    }

效果图:
toolbar.png

3.滑动菜单

通过 DrawerLayout 来实现滑动菜单 ,这个控件由 support-v4库提供。

这个布局允许放入两个直接子控件(布局),第一个是主屏幕中显示的内容,第二个是滑动菜单中的显示内容。
eg:
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/activity_main_drawerLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.tiger.materialdesigntest.MainActivity">

  <RelativeLayout
      android:layout_width="match_parent"
      android:layout_height="match_parent">
    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:titleTextColor="@color/myWhite"
        android:background="@color/colorPrimary"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>

  </RelativeLayout>

  <LinearLayout
      android:layout_gravity="left"
      android:orientation="vertical"
      android:background="#fff"
      android:layout_width="match_parent"
      android:layout_height="match_parent">
    <TextView
        android:text="Text1"
        android:textSize="30dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    <TextView
        android:text="Text2"
        android:textSize="30dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
  </LinearLayout>

</android.support.v4.widget.DrawerLayout>

效果图:
侧滑菜单.gif

需要注意:

<u>第二个子控件(布局) 必须指定 layout_gravity 属性,来设置侧滑菜单实在屏幕的那边显示。</u>

侧滑菜单自定义大小、显示的内容和样式

另外可以通过代码调出侧滑菜单和隐藏侧滑菜单

        final DrawerLayout  mDrawerLayout=(DrawerLayout)findViewById(R.id.activity_main_drawerLayout);
        //显示侧滑菜单
        mDrawerLayout.openDrawer(Gravity.LEFT);
        //隐藏侧滑菜单
        mDrawerLayout.closeDrawer(Gravity.LEFT);

4.NavigationView

5.SwitchCompat

switch.gif

常用属性:

属性 作用
showText: true/false 决定是否显示开关按钮上的文字
switchPadding 文字和开关的最小距离
trackTintMode 轨道样式
trackTint 轨道颜色
thumb 引用主题颜色
switchMinWidth 开关宽度
thumbTint 开关上按钮的颜色
textOff 设置按钮关闭状态显示的文字
textOn 设置按钮打开状态显示的文字
thumbTintMode 按钮样式
theme 主题

关于主题:

在styles.xml 添加新的style ,再通过 app:theme="@style/MySwitch",指定主题

    <style name="MySwitch" parent="Theme.AppCompat.Light">
        <!--开启时的颜色-->
        <item name="colorControlActivated">@color/colorPrimary</item>
        <!--关闭时的颜色-->
        <item name="colorSwitchThumbNormal">@color/switch_color</item>
        <!--关闭时的轨迹颜色取30%的颜色-->
        <item name="android:colorForeground">@color/switch_color</item>
    </style>

注意:有些 属性不能正常显示,需要使用 app:attribute 的形式来赋值

6.悬浮按钮

FloatingActionButton 看起来有立体效果的按钮 ,

<android.support.design.widget.FloatingActionButton
    android:id="@+id/faBtn"
    android:src="@drawable/ic_done"
    app:elevation="8dp"
    android:layout_margin="20dp"
    android:layout_gravity="bottom|end"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

关于 layout_gravity="bottom|end" 作用,指定显示位置

关于 app:elevation="8dp" : 阴影大小

指定一个高度值,高度值越大,投影范围也越大,但是投影效果越淡,高度值越小,投影范围也越小,但是投影效果越浓。其实看起来差别也不大。

7.Snackbar

更好的提示工具-----Snackbar

首先Snackbar并不是Toast 的替代品,他们两者之间各有个的特点。

Toast更多的是提示信息,告诉用户发生了什么。

而Snackbar则扩展了更多的功能,它允许在提示当中加入一个可交互的按钮,以便执行一些额外的逻辑操作。

设想这样一个场景,当删除一条记录后,直接提示用户删除成功。当用户想要撤销,那怎么办,那这个时候就用到了Snackbar。

​ 效果图:
snackbar.gif
          Snackbar.make(view,"Data deleted!",Snackbar.LENGTH_LONG).setAction("Undo", new View.OnClickListener() {
               @Override
               public void onClick(View view) {
                    //点击Undo 后的操作
                Toast.makeText(MainActivity.this, "Data restored!", Toast.LENGTH_SHORT).show();
              }
          }).show() ;

一般都写在Button 的点击事件中; view : view指的是 onClick方法的参数

8.CoordinatorLayout

CoordinatorLayout 是一个加强版的FrameLayout,由Design Support 提供。

实现了多种Material Design中提到的滚动效果

CoordinatorLayout 会自动监听所有子控件的各种事件,然后自动帮助我们做出最为合理的相应。

eg: 只需要改变外部布局为CoordinatorLayout

coordinatorLayout.gif

注意到效果了吧,悬浮按钮自动向上偏移了Snackbar的同等高度,从而保证不会被遮挡住。当Snackbar消失时,悬浮按钮会回到原先位置。

更多请参考:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0717/3196.html



9.CardView

CardView是实现卡片式布局的重要控件,由appcompat-v7库提供。

实际上CardView也是一个FrameLayout ,知识额外提供了圆角和阴影等效果,看上去会有立体的感觉。

添加依赖引用 compile 'com.android.support:cardview-v7:25.3.1'
<android.support.v7.widget.CardView
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:layout_gravity="center"
    app:cardCornerRadius="4dp"
    app:cardElevation="5dp">
    <TextView
        android:text="TextView"
        android:gravity="center"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</android.support.v7.widget.CardView>

app:cardCornerRadius="4dp" 圆角弧度,数值越大哦,弧度越大

app:cardElevation="5dp" 阴影大小,数值越大,阴影越大

效果图:
cardview.png

10.TextInputLayout

使用:直接将EdieText放到 TextInputLayout 中就可以,

注意一个TextInputLayout 下只能放置一个 EditTExt

<android.support.design.widget.TextInputLayout
    android:id="@+id/activity_test_textinputlayoutusername"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_below="@+id/activity_test_scrollView">
    <EditText
        android:id="@+id/username"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Username"/>
</android.support.design.widget.TextInputLayout>

效果图:
TextInputLayout.gif

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容