美文网首页
MaterialDesign

MaterialDesign

作者: 背影杀手不太冷 | 来源:发表于2016-06-24 10:23 被阅读393次

    MaterialDesign

    标签(空格分隔): Android


    ToolBar###

    可以看一下自己写的demo,名字叫TestMaterial
    这个demo主要参考文章:博客一
    也可以看一下这篇文章,知道一下开发过程中的坑,博客二
    关于ToolBar与ActionBar的比较,还有ToolBar的用法博客三
    ToolBar的一些特技:博客四

    注意事项
    1、不要把兼容包中的 Material Theme 使用到 Activity 上
    兼容包中的 Material Theme 是提供给 AppCompatActivity 使用的
    2、兼容包中与 Android 5.x 中的 Material Theme 在 style 中设置有区别


    沉浸式状态栏###

    第一种:实现toolBar与状态栏同色
    请看鸿洋博客
    实现原理请看为什么根布局加了一个与状态栏等高的View,就可以将那个新增的view放到StatusBar的位置,实现沉浸式布局
    这篇文章当中还有一些开发过程中的坑

    第二种:实现用图片覆盖状态栏
    请见博客中的ImageTranslucentTheme

    注意:StatusBar和NavigationBar都是系统级别的空间,开发者不可以像TextView那样随意调用,但是可以在Style.xml中设置

    <item name="android:windowTranslucentStatus">true</item>
    <item name="android:windowTranslucentNavigation">true</item>
    分别将StatusBar和NavigationBar变成透明
    

    DrawerLayout实现抽屉菜单###

    注意DrawerLayout不是materialDesign推出的,但是称用于搭配MaterialDesign####

    效果一:抽屉菜单覆盖AppBar
    1、使用toolBar实现:请参考这篇博客的效果一的有关段落
    2、使用ActionBAr实现。其实这当中的原理跟使用ToolBar来实现差不多,只是ToolBar与ActionBar的区别而已,只要把DrawerLayout 写在主布局的的最外层,这样就可以是实现抽屉菜单覆盖AppBar

    效果二:抽屉菜单显示在AppBar下方

    1、使用ActionBAr实现:请参考这篇博客的效果二的有关段落
    把DrawerLayout 写在主布局的的最外层,可是使用的是ActionBAr,所以抽屉菜单不会覆盖AppBar
    这篇翻译文档也是实现抽屉菜单显示在AppBar下方
    2、使用toolBar实现。只要不把DrawerLayout 写在主布局的的最外层,然后记得ToolBar的布局也不要被DrawerLayout包裹,这样就可以是实现抽屉菜单显示在AppBar下方

    现在新出的Design Support Library,可以让在6.0之前的版本可以更加方便的使用materialDesign的一些空间或者特性,例如里面的Navigation View通过使用menu,headerLayout等属性进一步简化了抽屉式导航框架的使用:


    RippleDrawable###

    视图的水波纹效果,RippleDrawable 其实就可以当作一个 Drawable,
    单一效果:
    在控件中直接使用
    android:attr/selectableItemBackground 有界限的波纹(低版本也可以使用)
    android:attr/selectableItemBackgroundBorderless 可以超出视图区域的波纹(minSdkVersion至少要21才能使用)
    更多的效果:
    drawable 文件夹中定义一个以 <ripple> 为根控件的 xml 文件,然后作为一个控件的背景即可。具体请看博客中的RippleDrawable部分【这个方法低版本不可以使用,只能用于5.0或之上】


    Material Design动画###

    还没了解


    palette###

    最新的用法看这篇博客
    无论是5.0还是5.0以下的都可使用,要引入[v7 support libraries r21],并且使用Theme.AppCompat主题

    应用场景:
    说Palette之前先说下前面提到的Pager。ViewPager是什么大家应该都是知道的了,一般ViewPager、xxxTabStrip、Fragment三个好基友是一起出现的。这里的xxxTabStrip是使用Github上的PagerSlidingTabStrip。当我们的Pager切换时伴随着Fragment的变化,而Fragment里的内容一般是不同的,所以每个Fragment里的一般视觉效果也是不同的,所以我们可以用Palette来去提取Fragment中的主色调,那Fragment中的拿什么给Palatte去提取颜色呢,这就需要自己根据自己的情况来决定的。比如我这个demo里,Fragment就一个TextView和给Fragment设了背景,那么我就可以把背景的图片给Palette去提取颜色了。


    视图与阴影###

    在5.0中加入了z值属性,对应垂直方向上的高度变化
    Z值由elevation与translation组成,
    在layout中使用 android:elevation属性去定义
    在代码中使用 View.setElevation 方法去定义
    设置视图的translation,可以使用View.setTranslationZ方法
    (改变视图高度的属性只支持5.0)

    或者在属性动画中view.annimate().translationZ(100);加入一个Z高度变化的动画。
    新的ViewPropertyAnimator.z和ViewPropertyAnimator.translationZ方法可以设置视图的elevation值
    (是否支持5.0以下的版本,还有待验证!!!!)

    可以参考一下这篇博客相应的部分
    应用场景:
    translationZ允许你创建一个动画暂时的反应出View的高度值(elevation)变化。
    这对于响应触摸手势很有用处,请看下面代码

    (官方Demo中的代码):
    int action = motionEvent.getActionMasked();  
                    switch (action) {  
                        case MotionEvent.ACTION_DOWN:  
                            Log.d(TAG, "ACTION_DOWN on view.");  
                            view.setTranslationZ(120);  
                            break;  
                        case MotionEvent.ACTION_UP:  
                            Log.d(TAG, "ACTION_UP on view.");  
                            view.setTranslationZ(0);  
                            break;  
                        default:  
                            return false;  
                            }
    

    应用场景图:


    此处输入图片的描述此处输入图片的描述
    此处输入图片的描述此处输入图片的描述

    Tinting(着色)###

    Android L还有一个独特的特点就是现在可以定义图片的alpha遮罩,并且可以轻松的使用android:tint属性去调整色调。

    使用tint属性给背景调整不同颜色的例子:
    <LinearLayout  
        android:orientation="horizontal"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:layout_gravity="center_horizontal">  
        <ImageView  
            ...  
            android:src="@drawable/xamarin_white"  
            android:background="@drawable/mycircle"/>  
        <ImageView  
            ...  
            android:src="@drawable/xamarin_white"  
            android:background="@drawable/mycircle"  
            android:tint="#2C3E50"/>  
        <ImageView  
            ...  
            android:src="@drawable/xamarin_white"  
            android:background="@drawable/mycircle"  
            android:tint="#B4BCBC"/>  
    </LinearLayout>  
    
    
    此处输入图片的描述此处输入图片的描述

    Clipping Views(裁剪视图)###


    RecyclerView###

    参考鸿洋大神博客,但是这篇博客的Click and LongClick请与泡在网上的日子的这篇博客一起看
    可以引入支持包兼容低版本

    dependencies {
        compile 'com.android.support:appcompat-v7:21.0.+'
        compile 'com.android.support:cardview-v7:21.0.+'
        compile 'com.android.support:recyclerview-v7:21.0.+'
    }
    

    以下的内容参考张涛博客

    RecyclerView重要的五个类:####

    RecyclerView.LayoutManager 负责Item视图的布局的显示管理
    RecyclerView.ItemDecoration 给每一项Item视图添加子View,例如可以进行画分隔线之类
    RecyclerView.ItemAnimator 负责处理数据添加或者删除时候的动画效果
    RecyclerView.Adapter 为每一项Item创建视图
    RecyclerView.ViewHolder 承载Item视图的子布局

    • ItemDecoration 工作原理
      temDecoration 是为了显示每个 item 之间分隔样式的。它的本质实际上就是一个 Drawable。当 RecyclerView 执行到 onDraw() 方法的时候,就会调用到他的 onDraw(),这时,如果你重写了这个方法,就相当于是直接在 RecyclerView 上画了一个 Drawable 表现的东西。 而最后,在他的内部还有一个叫getItemOffsets()的方法,从字面就可以理解,他是用来偏移每个 item 视图的。当我们在每个 item 视图之间强行插入绘画了一段 Drawable,那么如果再照着原本的逻辑去绘 item 视图,就会覆盖掉 Decoration 了,所以需要getItemOffsets()这个方法,让每个 item 往后面偏移一点,不要覆盖到之前画上的分隔样式了。

    • ItemAnimator工作原理
      每一个 item 在特定情况下都会执行的动画。说是特定情况,其实就是在视图发生改变,我们手动调用notifyxxxx()的时候。通常这个时候我们会要传一个下标,那么从这个标记开始一直到结束,所有 item 视图都会被执行一次这个动画。

    • Adapter工作原理(与listView的adapter不同)
      首先是适配器,适配器的作用都是类似的,用于提供每个 item 视图,并返回给 RecyclerView 作为其子布局添加到内部。
      但是,与 ListView 不同的是,ListView 的适配器是直接返回一个 View,将这个 View 加入到 ListView 内部。而 RecyclerView 是返回一个 ViewHolder 并且不是直接将这个 holder 加入到视图内部,而是加入到一个缓存区域,在视图需要的时候去缓存区域找到 holder 再间接的找到 holder 包裹的 View。

    • ViewHolder
      每个 ViewHolder 的内部是一个 View,并且 ViewHolder 必须继承自RecyclerView.ViewHolder类。 这主要是因为 RecyclerView 内部的缓存结构并不是像 ListView 那样去缓存一个 View,而是直接缓存一个 ViewHolder ,在 ViewHolder 的内部又持有了一个 View。既然是缓存一个 ViewHolder,那么当然就必须所有的 ViewHolder 都继承同一个类才能做到了。

    缓存与复用的原理:####

    此处输入图片的描述此处输入图片的描述

    RecyclerView 的内部维护了一个二级缓存,滑出界面的 ViewHolder 会暂时放到 cache 结构中,而从 cache 结构中移除的 ViewHolder,则会放到一个叫做 RecycledViewPool 的循环缓存池中。
    顺带一说,RecycledView 的性能并不比 ListView 要好多少,它最大的优势在于其扩展性。但是有一点,在 RecycledView 内部的这个第二级缓存池 RecycledViewPool 是可以被多个 RecyclerView 共用的,这一点比起直接缓存 View 的 ListView 就要高明了很多,但也正是因为需要被多个 RecyclerView 公用,所以我们的 ViewHolder 必须继承自同一个基类(即RecyclerView.ViewHolder)。
    默认的情况下,cache 缓存 2 个 holder,RecycledViewPool 缓存 5 个 holder。对于二级缓存池中的 holder 对象,会根据 viewType 进行分类,不同类型的 viewType 之间互不影响。


    CardView###

    它是一个使用了Material Desgin风格的FrameLayout,只不过比普通的FrameLayout多了圆角背景和阴影效果。所以它常用作ListView 或者 RecyclerView等视图Item的布局容器;
    使用场景请看这篇博客有关CardView的部分

    可以引入支持包支持低版本

    dependencies {
        compile 'com.android.support:appcompat-v7:21.0.+'
        compile 'com.android.support:cardview-v7:21.0.+'
        compile 'com.android.support:recyclerview-v7:21.0.+'
    }
    

    Meterial Dialog###

    关于Meterial Dialog可以看一下这篇博客,当中也有讲palette和CardView

    Android Support Library v22.1 中开始提供了 Material 风格的 Dialog 控件(官方提供的,很好,很强大)
    其实就是V7包的22版本


    Activity的过渡动画###

    取代overpendingtranstion。
    可是只支持5.0版本
    基本用法可以看看《群英传》


    Circular Reveal###

    只支持5.0版本
    参考网上资料


    View state changes Animation###

    根据视图状态改变来设置一个视图的状态切换动画
    只支持5.0版本

    • StateListAnimator
      可以让你定义动画集,能在view状态改变时工作。在切换状态的时候有个切换动画,不会像以前那么生硬!参考博客
    • animated-selector

    Curved motion(曲线运动)###

    只支持5.0版本
    Material design中的动画依靠曲线,这个曲线适用于时间插值器和控件运动模式。
    PathInterpolator类是一个基于贝塞尔曲线(Bézier curve)或路径(Path)对象上的新的插值器。


    Notification###


    维护兼容性###

    请看官方中文文档

    Theme.AppCompat 主题中提供了这些组件的 Material Design style:

    EditText
    Spinner
    CheckBox
    RadioButton
    SwitchCompat
    CheckedTextView


    Material适配详解###

    请看泡在网上的日子博客


    Android Design Support Library

    关于Android Design Support Library的使用请看这两篇博客的大概盘点:博客一博客二

    导读:
    这个兼容库很容易和之前的 Android Support Library 22.1混淆,都是兼容库,区别是这个库多了个Design。 Android Support Library 22.1只是支持了一些基本控件的材料设计化,但是这个库更多的是对一些特效的实现,这个库和github上的很多开源项目是有很大关系的,material design的很多效果,同一种效果在github上有太多的实现,现在官方把部分效果标准化了。

    • Snackbar
      Snackbar提供了一个介于Toast和AlertDialog之间轻量级控件,它可以很方便的提供消息的提示和动作反馈。(可以设置点击监听) Snackbar在出现一定时间后,就会消失,这与Toast一模一样。
    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();
    
    • Navigation View——更好地实现抽屉菜单
      简单例子:
    <android.support.v4.widget.DrawerLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:app="http://schemas.android.com/apk/res-auto"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fitsSystemWindows="true">
     
        <!-- your content layout -->
     
        <android.support.design.widget.NavigationView
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_gravity="start"
                app:headerLayout="@layout/drawer_header"
                app:menu="@menu/drawer"/>
    </android.support.v4.widget.DrawerLayout>
    
    //app:headerLayout  - 控制头部的布局, 
    //app:menu - 导航菜单的资源文件(也可以在运行时配置)。
    

    NavigationView处理好了和状态栏的关系,可以确保NavigationView 在API21+设备上正确的和状态栏交互。不用担心会覆盖住StatusBar!!

    以通过设置一个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;
                        }
                    });
        }
    

    剩下的控件就不一一列出来了


    Goolge新的开源项目——FlexboxLayout###

    简单使用:博客

    相关文章

      网友评论

          本文标题:MaterialDesign

          本文链接:https://www.haomeiwen.com/subject/npyodttx.html