Support Library -- Design

一、概念

Design Support Library是Google在2015的IO大会上发布的一个全新兼容函数库,它使得开发者可以在Android 2.1(API Level 7)及以上的设备中实现Material Design的效果,这个函数库提供了一系列的控件,主要包括:Snackbar、Navigation View、FloatActionButton、CoordinatorLayout、CollapsingToolbarLayout等。
在使用Design Support Library之前,需要添加依赖:

dependencies {
    compile 'com.android.support:design:23.1.1'
}

二、SnackBar

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

//第一个参数作为Snackbar显示的基准元素
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();

三、TextInputLayout

TextInputLayout主要作用是作为EditText的容器,从而为EditText默认生成一个浮动的Label,当用户点击EditText之后,EditText中设置的hint字符串会自动移动到EditText的左上角。
使用:

//布局


        



//代码
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) {
    }
}); 

四、FloatingActionButton

FloatingActionButton实现了一个默认颜色为主题中colorAccent的悬浮操作按钮。
使用:


五、TabLayout

Tab滑动切换View并不是一个新的概念,但是Google却是第一次在support库中提供了完整的支持。Design Library的TabLayout既实现了固定的选项卡(View的宽度平均分配),也实现了可滚动的选项卡(View的宽度不固定同时可以横向滚动)。选项卡可以在程序中动态添加,但通常滑动布局都会和ViewPager配合起来使用,通过setupWithViewPager方法把ViewPager和TabLayout结合了起来。
使用:

//动态添加
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
mViewPager = (ViewPager) findViewById(R.id.viewpager);
// 设置ViewPager的数据等
setupViewPager();
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(mViewPager);

六、NavigationView

NavigationView可以用来实现导航菜单界面。
使用:

//抽屉布局


    
    

    



//app:headerLayout



    

    



//app:menu




    
        
        
        
        
    

    
        
            
            
        
    

 

//代码
Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
final ActionBar ab = getSupportActionBar();
ab.setHomeAsUpIndicator(R.drawable.ic_menu);
ab.setDisplayHomeAsUpEnabled(true);

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

七、AppBarLayout

AppBarLayout跟它的名字一样,把容器类的组件全部作为AppBar。
使用:

//把Toolbar和TabLayout放到了AppBarLayout中,让他们当做一个整体作为AppBar


    

    


八、CoordinatorLayout

CoordinatorLayout是一个增强型的FrameLayout,它可以使得不同视图组件直接相互作用,并协调动画效果。CoordinatorLayout是基于定义在Behaviors中的规则集的,我们可以定义CoordinatorLayout内部的视图组件是如何相互作用并发生变化的。
使用:


      
     
    
 
    
            
 
            
     

其中,一个可以滚动的组件,例如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的使用场景,基本已经固定了。所有使用scroll flag的view都必须定义在没有使用scroll flag的view的前面,这样才能确保所有的view从顶部退出,留下固定的元素。

九、CollapsingToolbarLayout

CollapsingToolbarLayout控件可以实现当屏幕内容滚动时收缩Toolbar的效果,通常和AppBarLayout配合使用。
使用:



    

        

        

    


在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"属性一起配合更完美。

你可能感兴趣的:(Support Library -- Design)