Android Design Support Library使用详解

Android Design Support Library使用详解


Google在2015的IO大会上,给咱们带来了更加详细的Material Design设计规范,同时,也给咱们带来了全新的Android Design Support Library,在这个support库里面,Google给咱们提供了更加规范的MD设计风格的控件。最重要的是,Android Design Support Library的兼容性更广,直接能够向下兼容到Android 2.2。这不得不说是一个良心之做。css

使用Support Library很是简单:
添加引用便可:html

compile 'com.android.support:design:22.2.0'

下面咱们来看看这些新控件的基本使用方法,咱们从最简单的控件开始提及。java

Snackbar

Snackbar提供了一个介于Toast和AlertDialog之间轻量级控件,它能够很方便的提供消息的提示和动做反馈。
Snackbar的使用与Toast的使用基本相同:android

Snackbar.make(view, Snackbar comes out, Snackbar.LENGTH_LONG)
                        .setAction(Action, new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                Toast.makeText(
                                        MainActivity.this,
                                        Toast comes out,
                                        Toast.LENGTH_SHORT).show();
                            }
                        }).show();

须要注意的是,这里咱们把第一个参数做为Snackbar显示的基准元素,而设置的Action也能够设置多个。app

显示的效果就相似以下:ide

这里写图片描述vcu1w/ejujwvcD4NCjxwPmh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvc3VwcG9ydC9kZXNpZ24vd2lkZ2V0L1NuYWNrYmFyLmh0bWw8L3A+DQo8cD48aW1nIGFsdD0=" 这里写图片描述" src="/uploadfile/Collfiles/20150605/20150605084858146.png" title="\" />布局

TextInputLayout

TextInputLayout做为一个父容器控件,包装了新的EditText。一般,单独的EditText会在用户输入第一个字母以后隐藏 hint提示信息,可是如今你可使用TextInputLayout 来将EditText封装起来,提示信息会变成一个显示在EditText之上的floating label,这样用户就始终知道他们如今输入的是什么。同时,若是给EditText增长监听,还能够给它增长更多的floating label。字体

下面咱们来看这与一个TextInputLayout:动画

 

必定要注意,他是把EditText包含起来的,不能单独使用。this

在代码中,咱们给它设置监听:

final TextInputLayout textInputLayout = (TextInputLayout) findViewById(R.id.til_pwd);

        EditText editText = textInputLayout.getEditText();
        textInputLayout.setHint(Password);

        editText.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                if (s.length() > 4) {
                    textInputLayout.setError(Password error);
                    textInputLayout.setErrorEnabled(true);
                } else {
                    textInputLayout.setErrorEnabled(false);
                }
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
            }

            @Override
            public void afterTextChanged(Editable s) {
            }
        });
    }

这样:显示效果以下:

这里写图片描述

当输入时:

这里写图片描述

这里须要注意的是,TextInputLayout的颜色来自style中的colorAccent的颜色:

#1743b7

下面咱们给出Google API Doc上的说明,了解TextInputLayout的详细使用方法:

http://developer.android.com/reference/android/support/design/widget/TextInputLayout.html

这里写图片描述

Floating Action Button

floating action button 是一个负责显示界面基本操做的圆形按钮。Design library中的FloatingActionButton 实现了一个默认颜色为主题中colorAccent的悬浮操做按钮,like this:

这里写图片描述

FloatingActionButton——FAB使用很是简单,你能够指定在增强型FrameLayout里面——CoordinatorLayout,这个咱们后面再将。
关于FAB的使用,你能够把它当作一个button便可。

 

经过指定layout_gravity就能够指定它的位置。
一样,你能够经过指定anchor,即显示位置的锚点:

 

除了通常大小的悬浮操做按钮,它还支持mini size(fabSize=”mini”)。FloatingActionButton继承自ImageView,你可使用android:src或者 ImageView的任意方法,好比setImageDrawable()来设置FloatingActionButton里面的图标。

http://developer.android.com/reference/android/support/design/widget/FloatingActionButton.html

TabLayout

Tab滑动切换View并非一个新的概念,可是Google倒是第一次在support库中提供了完整的支持,并且,Design library的TabLayout 既实现了固定的选项卡 - view的宽度平均分配,也实现了可滚动的选项卡 - view宽度不固定同时能够横向滚动。选项卡能够在程序中动态添加:

TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.addTab(tabLayout.newTab().setText(tab1));
        tabLayout.addTab(tabLayout.newTab().setText(tab2));
        tabLayout.addTab(tabLayout.newTab().setText(tab3));

但大部分时间咱们都不会这样用,一般滑动布局都会和ViewPager配合起来使用,因此,咱们须要ViewPager来帮忙:

mViewPager = (ViewPager) findViewById(R.id.viewpager);
        // 设置ViewPager的数据等
        setupViewPager();
        TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(mViewPager);

经过一句话setupWithViewPager,咱们就把ViewPager和TabLayout结合了起来。

这里写图片描述

http://developer.android.com/reference/android/support/design/widget/TabLayout.html

NavigationView在MD设计中很是重要,以前Google也提出了使用DrawerLayout来实现导航抽屉。此次,在 support library中,Google提供了NavigationView来实现导航菜单界面,因此,新的导航界面能够这样写了:

 

其中最重要的就是这两个属性:

app:headerLayout
app:menu

经过这两个属性,咱们能够很是方便的指定导航界面的头布局和菜单布局:

这里写图片描述

其中最上面的布局就是app:headerLayout所指定的头布局:

 

而下面的菜单布局,咱们能够直接经过menu内容自动生成,而不须要咱们来指定布局:

 
 

你能够经过设置一个OnNavigationItemSelectedListener,使用其 setNavigationItemSelectedListener()来得到元素被选中的回调事件。它为你提供被点击的 菜单元素 ,让你能够处理选择事件,改变复选框状态,加载新内容,关闭导航菜单,以及其余任何你想作的操做。例如这样:

private void setupDrawerContent(NavigationView navigationView) {
        navigationView.setNavigationItemSelectedListener(
                new NavigationView.OnNavigationItemSelectedListener() {
                    @Override
                    public boolean onNavigationItemSelected(MenuItem menuItem) {
                        menuItem.setChecked(true);
                        mDrawerLayout.closeDrawers();
                        return true;
                    }
                });
    }

可见,Google将这些东西封装的很是易于使用了。

AppBarLayout

AppBarLayout跟它的名字同样,把容器类的组件所有做为AppBar。like this:

这里写图片描述

这里就是把Toolbar和TabLayout放到了AppBarLayout中,让他们当作一个总体做为AppBar。

 

http://developer.android.com/reference/android/support/design/widget/AppBarLayout.html

CoordinatorLayout

CoordinatorLayout是此次新添加的一个加强型的FrameLayout。在CoordinatorLayout中,咱们能够在FrameLayout的基础上完成不少新的操做。

Floating View

MD的一个新的特性就是增长了不少可悬浮的View,像咱们前面说的Floating Action Button。咱们能够把FAB放在任何地方,只须要经过:

android:layout_gravity=end|bottom

来指定显示的位置。同时,它还提供了layout_anchor来供你设置显示坐标的锚点:

app:layout_anchor=@id/appbar

建立滚动

CoordinatorLayout能够说是此次support library更新的重中之重。它从另外一层面去控制子view之间触摸事件的布局,Design library中的不少控件都利用了它。

一个很好的例子就是当你将FloatingActionButton做为一个子View添加进CoordinatorLayout而且将 CoordinatorLayout传递给 Snackbar.make(),在3.0及其以上的设备上,Snackbar不会显示在悬浮按钮的上面,而是FloatingActionButton 利用CoordinatorLayout提供的回调方法,在Snackbar以动画效果进入的时候自动向上移动让出位置,而且在Snackbar动画地消 失的时候回到原来的位置,不须要额外的代码。

官方的例子很好的说明了这一点:

 

其中,一个能够滚动的组件,例如RecyclerView、ListView(这里须要注意的是,貌似只支持RecyclerView、ListView,若是你用一个ScrollView,是没有效果的)。若是:
一、给这个可滚动组件设置了layout_behavior
二、给另外一个控件设置了layout_scrollFlags
那么,当设置了layout_behavior的控件滑动时,就会触发设置了layout_scrollFlags的控件发生状态的改变。

这里写图片描述

设置的layout_scrollFlags有以下几种选项:

scroll: 全部想滚动出屏幕的view都须要设置这个flag- 没有设置这个flag的view将被固定在屏幕顶部。 enterAlways: 这个flag让任意向下的滚动都会致使该view变为可见,启用快速“返回模式”。 enterAlwaysCollapsed: 当你的视图已经设置minHeight属性又使用此标志时,你的视图只能已最小高度进入,只有当滚动视图到达顶部时才扩大到完整高度。 exitUntilCollapsed: this flag causes the view to scroll off until it is ‘collapsed’ (its minHeight) before exiting。

须要注意的是,后面两种模式基本只有在CollapsingToolbarLayout才有用,而前面两种模式基本是须要一块儿使用的,也就是说,这些flag的使用场景,基本已经固定了。
例如咱们前面例子中的,也就是这种模式:

app:layout_scrollFlags=scroll|enterAlways

PS : 全部使用scroll flag的view都必须定义在没有使用scroll flag的view的前面,这样才能确保全部的view从顶部退出,留下固定的元素。

http://developer.android.com/reference/android/support/design/widget/CoordinatorLayout.html

CollapsingToolbarLayout

CollapsingToolbarLayout提供了一个能够折叠的Toolbar,这也是Google+、photos中的效果。Google把它作成了一个标准控件,更加方便你们使用。

这里先看一个例子:

 

咱们在CollapsingToolbarLayout中放置了一个ImageView和一个Toolbar。并把这个 CollapsingToolbarLayout放到AppBarLayout中做为一个总体。在CollapsingToolbarLayout中,我 们分别设置了ImageView和一个Toolbar的layout_collapseMode。
这里使用了CollapsingToolbarLayout的app:layout_collapseMode=”pin”来确保Toolbar在 view折叠的时候仍然被固定在屏幕的顶部。当你让CollapsingToolbarLayout和Toolbar在一块儿使用的时候,title会在展 开的时候自动变得大些,而在折叠的时候让字体过渡到默认值。必须注意,在这种状况下你必须在CollapsingToolbarLayout上调用 setTitle(),而不是在Toolbar上。

除了固定住view,你还可使用app:layout_collapseMode=”parallax”(以及使用 app:layout_collapseParallaxMultiplier=”0.7”来设置视差因子)来实现视差滚动效果(好比 CollapsingToolbarLayout里面的一个ImageView),这中状况和CollapsingToolbarLayout的 app:contentScrim=”?attr/colorPrimary”属性一块儿配合更完美。

在这个例子中,咱们一样设置了:

app:layout_scrollFlags=scroll|exitUntilCollapsed>

来接收一个:

app:layout_behavior=@string/appbar_scrolling_view_behavior>

这样才能产生滚动效果,而经过layout_collapseMode,咱们就设置了滚动时内容的变化效果。

这里写图片描述

再来看一个官方的实例:

这里写图片描述

CoordinatorLayout与自定义view

有一件事情必须注意,那就是CoordinatorLayout并不知道FloatingActionButton或者AppBarLayout的 内部工做原理 - 它只是以Coordinator.Behavior的形式提供了额外的API,该API可使子View更好的控制触摸事件与手势以及声明它们之间的依 赖,并经过onDependentViewChanged()接收回调。

可使用CoordinatorLayout.DefaultBehavior(你的View.Behavior.class)注解或者在布局中使 用app:layout_behavior=”com.example.app.你的View$Behavior”属性来定义view的默认行为。 framework让任意view和CoordinatorLayout结合在一块儿成为了可能。

 

总结

通过几天的研究,Google此次提出的Android Design Support Library的意义其实并不在于给出了这些很是好的控件,其实这些控件在Github上基本都能找到相应的。它的目的在于Google给出了官方的设计 指导,进一步完善了MD设计思想。这才是Android Design Support Library最重要的特性。固然,平心而论,这些控件的使用并非很是的人性化,过多的封装致使整个效果不是很是的具备可定制性,可是,这毕竟是 Google迈出的第一步,后面必定会更加牛逼。

Demo

最后,给出一个融合MD和Android Design Support Library的Demo供你们研究,相信结合文章和代码,你们必定能很快理解Android Design Support Library的使用方法。

相关文章
相关标签/搜索