Android Support Library 23.2用法简析

写在前面的几句话


前几天谷歌发布了android-support-library-23.2支持库,这一次23.2版本增加了一些新的支持库以及新的功能。接下来这篇文章,就是对这些新功能部分做简单的用法介绍

这次更新增加的东西有:

  • Support Vector Drawables and Animated Vector Drawables
  • AppCompat DayNight theme
  • Design Support Library: Bottom Sheets
  • Support v4: MediaBrowserServiceCompat
  • RecyclerView
  • Custom Tabs
  • Leanback for Android TV

需要添加的依赖如下:

compile 'com.android.support:appcompat-v7:23.2.0'
compile 'com.android.support:design:23.2.0'
compile 'com.android.support:support-vector-drawable:23.2.0'
compile 'com.android.support:animated-vector-drawable:23.2.0'

分别说明使用方法

1.Support Vector Drawables and Animated Vector Drawables(支持矢量图片和矢量图片动画)


其实前面的文章关于Metarial Design动画中也有介绍到矢量图与矢量图的动画,但是那是局限于5.0以上的设备才可以使用,没想到这么快就Support包就向下支持了,其实使用方法也很类似,大家可以参考下那篇文章,

想在低版本使用还需要做点东西:

AndroidStudio1.4已经引入过矢量绘图支持在构建时生成PNG图像。要想禁用此功能(并想使用最新支持库),你需要在你的build.gradle里面添加vectorDrawables.useSupportLibrary = true

// Gradle Plugin 2.0+  
 android {  
   defaultConfig {  
     vectorDrawables.useSupportLibrary = true  
    }  
 }

你会发现这个新的属性只在AndroidStudio2.0版本存在。如果您使用的是AndroidStudio1.5,需要

// Gradle Plugin 1.5  
 android {  
   defaultConfig {  
     generatedDensities = []  
  }  

  // This is handled for you by the 2.0+ Gradle Plugin  
  aaptOptions {  
    additionalParameters "--no-version-vectors"  
  }  
 }

通常需要在三个xml文件中定义可动的矢量图:

一个矢量图使用元素,放在res/drawable/下。

一个可动的矢量图使用元素,放在res/drawable/下。

一个或更多个动画对象使用元素,放在res/anim/下。

可动矢量图可以使用元素。元素定义一系列路径或者子组,元素定义可绘图的路径。

当你定义了一个想要作用动画的矢量可绘制图,使用android:name属性给每个group和path指定一个唯一的名字,这样你可以从动画的定义中找到他们。

res/drawable/vector_drawable_cpu_ani.xml




    
        
    
    
        
    
    
        
    
    
        
    
    
        
    


res/drawable/animated_cpu.xml




    

    

    

    

res/anim/anim_left.xml



    

最后调用

//Support Vector Drawables
app:srcCompat="@drawable/vector_drawable_cpu_ani"
// Animated Vector Drawables
app:srcCompat="@drawable/animated_cpu"
图1 Support Vector Drawables and Animated Vector Drawables效果图

至于pathData中的东西,其实前面也有说过SVG标准指令,这里就不做过多概述了

2.AppCompat DayNight theme(DayNight 主题)


之前有看到同事折腾这个DayNight模式折腾还蛮久,不过这次谷歌出了,倒是可以省去不少时间

DayNight主题包含DayNight.NoActionBar, DayNight.DarkActionBar, DayNight.Dialog 等等,DayNight主题支持应用切换 白天 和 夜晚 主题,根据 是否为 ‘夜晚’ 决定是否从白天主题有效的切换到夜晚主题。注意这里的DayNight主题只支持API14以上

使用方法如下:

首先要设置Application或者单独Activity的theme为DayNight主题

themes.xml


AndroidManifest,xml

android:theme="@style/AppTheme.DayNight.NoActionBar"

DayNight主题有四个的模式:

  • MODE_NIGHT_NO 始终使用天(光)的主题

  • MODE_NIGHT_YES 始终使用夜间(黑暗)的主题

  • MODE_NIGHT_AUTO 根据一天中的时间昼/夜之间的变化。

  • MODE_NIGHT_FOLLOW_SYSTEM 此设置遵循系统的设置,基本上是以MODE_NIGHT_NO为主

我们可以通过我们通过调用AppCompatDelegate.setDefaultNightMode(),与getDelegate()。setLocalNightMode()来改变

但是两者设置是有区别的,

  • AppCompatDelegate.setDefaultNightMode()的设置是对整个App中theme为DayNight主题生效
  • getDelegate().setLocalNightMode()的设置只对于设置的地方生效

AppCompatDelegate.setDefaultNightMode()

public void ChangeDayNight(View v){
    switch (v.getId()){
        case R.id.day:
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
            recreate();
            break;
        case R.id.night:
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
            recreate();
            break;
    }
}
Android Support Library 23.2用法简析_第1张图片
图2 AppCompatDelegate.setDefaultNightMode()设置

getDelegate().setLocalNightMode()

public void ChangeDayNight(View v){
    switch (v.getId()){
        case R.id.day:
            getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_NO);
            recreate();
            break;
        case R.id.night:
            getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_YES);
            recreate();
            break;
    }
}
Android Support Library 23.2用法简析_第2张图片
图3 getDelegate().setLocalNightMode()设置

但是如果把AppCompatDelegate.setDefaultNightMode()与getDelegate().setLocalNightMode()写在一起你就会发现一个有趣的情况

public void ChangeDayNight(View v){
    switch (v.getId()){
        case R.id.day:
            getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_NO);
            recreate();
            break;
        case R.id.night:
             AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
            recreate();
            break;
    }
}
Android Support Library 23.2用法简析_第3张图片
图4 两种用法一起

看图可以发现,一开始都是白天模式的,然后我先设置了day及 getDelegate().setLocalNightMode()方法,然后设置了AppCompatDelegate.setDefaultNightMode()方法,但是这里的设置为night的方法并没有生效,但是当跳转到另外的一个界面的时候却发现这个界面是夜晚的模式,所以其实AppCompatDelegate.setDefaultNightMode()方法是生效了的,那么为什么在第一个界面设置AppCompatDelegate.setDefaultNightMode()方法没有生效呢?

我们看下AppCompatDelegate.setDefaultNightMode()这个方法前面的注释

Sets the default night mode. This is used across all activities/dialogs but can be overriden locally via {@link #setLocalNightMode(int)}.

所以其实当前Activity中getDelegate().setLocalNightMode()方法设置后会覆盖掉AppCompatDelegate.setDefaultNightMode()方法,导致看起来好像没有生效,其实是已经生效了的。

3.Design Support Library : Bottom Sheets (材料设计,底部表)


Design Support Library 其实准备作为Metarial Design的第四篇文章进行说明的,这里提前说明Bottom Sheets的使用

Bottom Sheets 可以在Activity,Fragment,以及Dialog中使用,使用时候继承的父类分别是:AppCompatActivity,AppCompatFragment,AppCompatDialog

先说明Bottom Sheets在Activity中的使用

1.创建Xml




    

布局很简单有一个Button 和一个linearLayout,其实是把这个LinearLayout作为底部弹出的View,但是注意LinearLayout多出了几个新的东西

  • app:layout_behavior="@string/bottom_sheet_behavior" 这个属性是作为Bottom Sheet必须的属性
  • app:behavior_hideable="false" 这个属性是当我们拖拽下拉的时候,bottom sheet是否能全部隐藏
  • app:behavior_peekHeight="0dp" 这个属性是当Bottom Sheets关闭的时候,底部下表我们能看到的高度

另外这里必须用CoordinatorLayout才可以生效

2.代码中

final BottomSheetBehavior behavior = BottomSheetBehavior.from(mlinearlayout);
behavior.setState(BottomSheetBehavior.STATE_EXPANDED);

mlinearlayout.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        behavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
    }
});

这里是通过附加一个BottomSheetBehavior 给CoordinatorLayout的子视图,behavior.setState()是设置Bottom Sheet的状态,Bottom Sheet的状态有5种:

  • STATE_COLLAPSED: 关闭Bottom Sheets,显示peekHeight的高度,默认是0
  • STATE_DRAGGING: 用户拖拽Bottom Sheets时的状态
  • STATE_SETTLING: 当Bottom Sheets view摆放时的状态。
  • STATE_EXPANDED: 当Bottom Sheets 展开的状态
  • STATE_HIDDEN: 当Bottom Sheets 隐藏的状态

我们可以通过setBottomSheetCallback来监听Bottom Sheet的回调

behavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
    @Override
    public void onStateChanged(View bottomSheet, int newState) {   
    }
    @Override
    public void onSlide(View bottomSheet, float slideOffset) {
    }
});

onSlide方法是拖拽中的回调可以根据slideOffset做动画,onStateChanged方法可以监听到状态的改变

Android Support Library 23.2用法简析_第4张图片
图5 Activity中BottomSheet的使用效果图

至于Fragment的使用则与Activity中相似,就不做声明,参考Activity的使用即可。

接下来说明下Dialong的使用方式:

final BottomSheetDialog dialog = new BottomSheetDialog(this);
View view = LayoutInflater.from(this).inflate(R.layout.bottomdialog_layout, null);
LinearLayout linearLayout = (LinearLayout)view.findViewById(R.id.dialog_layout);
linearLayout.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        dialog.dismiss();
    }
});
dialog.setContentView(view);
dialog.show();

使用其实与普通的Dialog差不多

效果如下:

Android Support Library 23.2用法简析_第5张图片
图6 Dialog中BottomSheet的使用效果图

如果要在Bottom Sheets里面使用滑动的布局,则需要使用NestedScrollView, RecyclerView,或者ListView/ScrollView on API 21+

4.Support v4: MediaBrowserServiceCompat


该Support v4库用作许多支持库的基础,并且为一些新版本介绍的特征提供支持(backports)。添加到以前发布的MediaSessionCompat类,为媒体播放了提供了坚实的基础,这个版本增加了MediaBrowserServiceCompat和MediaBrowserCompat提供,带来了最新的API兼容的解决方案(甚至没有在L设备上加)支持API4+。这使得我们更容易地在Android上支持媒体的播放和在Android Wear上浏览媒体,为我们提供了一个标准的接口,让你的媒体播放服务与界面连起来。

由于我不是很关心,所以没有了解这方法的东西,跳过

5.RecyclerView


RecyclerView组件为我们提供了灵活的创建列表和网格以及动画的特性。这个版本带来一个激动人心的新特性LayoutManager API:自动测量!!!这允许RecyclerView尺寸大小根据其内容的大小尺寸定制。这意味着,先前不可用的情况,例如使用WRAP_CONTENT为尺寸的RecyclerView,现在都是可能的。你会发现所有内置的布局管理现在都支持自动测量。由于这种变化,一定要确保你的item的布局属性:以前被忽视的布局参数(如MATCH_PARENT的滚动方向)现在将不一样。如果你有一个自定义的LayoutManager并且不是基于之前的拓展,有一个选择就是你可以调用setAutoMeasureEnabled(true),以及做一些小的变化(详情见Javadoc)来支持新特性注意,虽然RecyclerView支持动画,但是他不支持自己动画边界变化,如果你想对RecyclerView边界进行动画处理,你可以使用 Transition APIs.

这里变化从使用代码层面来说没有什么太多变化,就不上代码了。

6.Custom Tabs(自定义选项卡)

烂尾很久了,这里看了下没有太多资料,最近又比较忙,准备下次开篇专门的文章介绍下,好的就这样了。

你可能感兴趣的:(Android Support Library 23.2用法简析)