Material Design控件总结

1. Toolbar

知识点1:Toolbar和ActionBar的区别?

Toolbar与ActionBar类似,但ActionBar只能仅位于活动的顶部,而且也不能实现Material Design效果,使用不灵活。一般在开发时都会在app的theme里设置不显示ActionBar,如下:

    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

知识点2:colorPrimary,colorAccent等分别是设置哪块的色值?

这里写图片描述
并用Toolbar代替ActionBar,如下设置:

<android.support.v7.widget.Toolbar xmlns:app="http://schemas.android.com/apk/res-auto"
                android:id="@+id/tool_bar"
                android:layout_width="match_parent"
                android:layout_height="@dimen/titlebar_height"
                android:background="@color/colorPrimary"
                app:contentInsetStart="0.0dp"
                app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
                app:theme="@style/ToolbarStyle">

知识点3:为什么要指定新的xmlns:app命名空间?

由于Material Design是在Android 5.0系统才出现的,很多的Material属性在5.0之前系统不存在,为了兼容之前老系统,就不能直接用android:atrribute这样的写法,而应该使用app:attribute
app:theme是设置toolbar的主题,app:popupTheme是设置弹出菜单项的主题,为淡色主题

知识点4:在xml中写好了Toolbar,代码中应该怎么用?

Toolbar toolbar = (Toolbar) findViewById(R.id.tool_bar);//获得Toolbar实例
setSupportActionBar(toolbar);//将toolbar实例传入,这样既保证使用了Toolbar,又让它的外观与功能都和ActionBar一致。

知识点5:怎么给Toolbar设置返回按钮和标题?

  1. 设置标题
    方法1: 在AndroidMainfest.xml相应的activity注册信息里,添加android:label属性
    方法2: 调用Toolbar里的setTitle()方法,但是使用时要注意,有些时候设置了,发现标题栏并没有跟着变,是你使用姿势不对哦。以下两种方法都可以成功设置Toolbar的标题
    (1) 在setSupportActionBar(titletoolbar);之前调用ToolBar的setTitle方法。
    (2) 在Activity的onResume周期中调用。
    方法3: 自己在Toolbar里添加TextView控件,并隐藏系统的title,然后直接给自己定义的TextView控件设置值。
        ActionBar actionBar = getSupportActionBar();
        if (actionBar != null) {
            //去除默认Title显示
            actionBar.setDisplayShowTitleEnabled(false);
        }

2 设置返回按钮
方法1: 利用Toolbar自带的返回
getSupportActionBar().setDisplayHomeAsUpEnabled(true);//显示返回键
还可以自定义返回按钮

ActionBar actionBar = getSupportActionBar();
        if (actionBar != null) {
            actionBar.setDisplayHomeAsUpEnabled(true);
            actionBar.setHomeAsUpIndicator(R.mipmap.icon_back);
        }

方法2: 在Toolbar布局内部自定义ImageButton控件,并设置其图标

2. 滑动菜单DrawLayout

知识点1: DrawLayout可以包含几个子控件,它们的关系是怎样的?

可以通过左滑或是右滑主屏幕,将菜单显示出来,如下图所示:
这里写图片描述
DrawerLayout允许在布局中放入两个直接子控件,第一个子控件是主屏幕中显示的内容,第二个子控件是滑动菜单中显示的内容。

<android.support.v4.widget.DrawerLayout
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:openDrawer="start">
     <include
        layout="@layout/app_bar_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        app:headerLayout="@layout/nav_header_main"
        app:menu="@menu/main"
        />
</android.support.v4.widget.DrawerLayout>

第二个子控件中的layout_gravity属性是必须指定,告诉DrawerLayout滑动菜单是在屏幕的左边还是右边,left表示滑动菜单在左边,right表示滑动菜单在右边。start会根据系统语言判断,若系统语言是从左至右,如英语、汉语等,滑动菜单在左边,若系统语言是从右往左,如阿拉伯语,滑动菜单就在右边。

知识点2: 如要想在主界面点击某个按钮弹出左滑的菜单栏如何实现?

可以在主界面标题栏中添加一个导航栏按钮,设置点击的响应方式为:

mDrawerLayout.open(GravityCompat.START);//打开左侧菜单栏
mDrawerLayout是xml中定义的DrawerLayout的实例。

如果想关闭菜单,则调用mDrawerLayout.closeDrawers();

知识点3:NavigationView有什么特殊之处?

NavigationView是android5.0之后推出的一个抽屈菜单,菜单栏整体上分为两部分,上面部分叫HeaderLayout, 下面的点击项都是menu
menu定义如下:

<menu xmlns:android="http://schemas.android.com/apk/res/android">  
    <item  
        android:id="@+id/favorite"  
        android:icon="@mipmap/ic_launcher"  
        android:title="收藏"/>  
    <item  
        android:id="@+id/wallet"  
        android:icon="@mipmap/ic_launcher"  
        android:title="钱包"/>  
    <item  
        android:id="@+id/photo"  
        android:icon="@mipmap/ic_launcher"  
        android:title="相册"/>  
    <item  
        android:id="@+id/file"  
        android:icon="@mipmap/ic_launcher"  
        android:title="文件"/>  
</menu> 

每一项item表示一个菜单,android:icon指定菜单的图标,android:title指定菜单显示的文字

3. 悬浮按钮FloatingActionBar

 <android.support.design.widget.FloatingActionButton
            style="@style/layout_ww"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true"
            android:layout_margin="15dp"
            android:src="@mipmap/actionbar_add_icon"
            android:id="@+id/add_fab"/>

它会悬浮在当前界面上,按钮默认的背景色为应用主题色colorAccent,也可以自定义背景色值,app:backgroundTint这里可以设置按钮点击和常态色值。
还可与CoordinatorLayout结合使用,设置app:layout_behavior和app:layout_scrollFlags=”scroll|enterAlways|snap”,让按钮在列表向上滑动时隐藏,向下滑动时显示。

4. 卡片布局CardView

CardView类似于FrameLayout,只是额外提供了圆角和阴影等效果,看上去会有立体的感觉。

<android.support.v7.widget.CardView 
    android:id="@+id/cardView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/white"
    android:padding="10dp"
    app:cardCornerRadius="4dp"
    app:elevation="4dp">

app:cardCornerRadius是指定卡片圆角的弧度,数值越大,圆角的弧度也越大;
app:elevation指定卡片高度,值越大,投影范围也越大,投影效果越淡。

5. 下拉刷新SwipeRefreshLayout

将SwipeRefreshLayout包裹在需要刷新布局外面。

<android.support.v4.widget.SwipeRefreshLayout  
       android:id="@+id/demo_swiperefreshlayout"  
       android:layout_width="fill_parent"  
       android:layout_height="fill_parent"  
        android:scrollbars="vertical"  
        >  
       <android.support.v7.widget.RecyclerView  
           android:id="@+id/demo_recycler"  
           android:layout_width="fill_parent"  
           android:layout_height="fill_parent"  
           ></android.support.v7.widget.RecyclerView>  
   </android.support.v4.widget.SwipeRefreshLayout>  
在具体代码中使用:
demo_swiperefreshlayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {  
            @Override  
            public void onRefresh() {  
                //刷新的操作
            }  
        });  

6. 可折叠标题栏CollapsingToolbarLayout

CollapsingToolbarLayout是一个作用于Toolbar基础上的布局,CollapsingToolbarLayout只能作为AppBarLayout的直接子布局来使用。AppBarLayout又必须是CoordinatorLayout子布局。
具体使用如下:

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/main_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true">

        <android.support.design.widget.AppBarLayout
            android:id="@+id/appbar"
            android:layout_width="match_parent"
            android:layout_height="200dp"
            android:fitsSystemWindows="true"
            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

            <android.support.design.widget.CollapsingToolbarLayout
                android:id="@+id/collapsing_toolbar"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:fitsSystemWindows="true"
                app:contentScrim="?attr/colorPrimary"
                app:expandedTitleMarginEnd="64dp"
                app:expandedTitleMarginStart="48dp"
                app:layout_scrollFlags="scroll|exitUntilCollapsed">

                <ImageView
                    android:id="@+id/logo"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:background="@mipmap/header_img"
                    android:contentDescription="@null"
                    android:fitsSystemWindows="true"
                    android:scaleType="fitCenter"
                    app:layout_collapseMode="parallax"
                    app:layout_collapseParallaxMultiplier="0.1" />

                <android.support.v7.widget.Toolbar
                    android:id="@+id/toolbar"
                    android:layout_width="match_parent"
                    android:layout_height="?attr/actionBarSize"
                    app:layout_collapseMode="pin"
                    app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

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

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

        <android.support.v4.widget.NestedScrollView
            android:id="@+id/nested_scroll_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior">

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="@string/large_text" />

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

        <android.support.design.widget.FloatingActionButton
            android:id="@+id/floating_action_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="@dimen/fab_margin"
            android:clickable="true"
            android:src="@mipmap/ic_star_black_24dp"
            app:layout_anchor="@id/appbar"
            app:layout_anchorGravity="bottom|right|end" />

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

具体说明可见我的另一篇博客:http://blog.csdn.net/smileiam/article/details/61643006
CollapsingToolbarLayout中定义了一个ImageView和一个Toolbar,这个标题栏将由普通标题栏加上图片组合而成。
app:layout_collapseMode用于指定当前控件在CollapsingToolbarLayout折叠过程中的折叠模式,Toolbar指定成pin,表示在折叠过程中始终保持不变,ImageView设置成parallax,表示会在折叠过程中产生一定的错位偏移。

7. 如何实现沉浸式状态栏?

要让背景图能和系统栏融合,需要借助android:fitsSystemWindows属性,设置android:fitsSystemWindows=”true”表示该控件会出现在系统状态栏里,不过需要把该控件的所有父布局都设置成该属性才行。同时还需把主题中的状态栏颜色指定成透明色。在主题中设置android:statusBarColor属性值设置成@android:color/transparent。不过这个属性是从Android5.0系统开始才有,需要创建一个values-21目录,并设置styles.xml,在里边设置状态栏色值,而在默认的values文件夹的styles.xml中不设置状态栏色值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值