close
当前位置: 物联网在线 > 技术文库 > android >

StateListAnimator 介绍

StateListAnimator 是在 Android 5.1 版本引入的。在这之前,处理 View 的点击状态一般都是使用 StateListDrawable 来完成的。

啥? 您没用过 StateListDrawable ?

下面的文件 (res/drawable/foreground_selector.xml) 内容,您一定很熟悉吧!

<?xmlversion="1.0" encoding="utf-8"?> <selectorxmlns:android="http://schemas.android.com/apk/res/android">   <itemandroid:color="@color/transparentAccent"     android:state_pressed="true">     <shape>       <solidandroid:color="@color/transparentAccent"/>     </shape>   </item>     <item>     <shape>       <solidandroid:color="@android:color/transparent"/>     </shape>   </item> </selector>

这就是一个 StateListDrawable 对象,当设置为 View 的背景的时候,不同的状态可以使用不同的背景图片表示。

效果如下图:

StateListAnimator 介绍

您可能会问, 使用 StateListDrawable 很好啊, 不同的点击状态使用不同的背景来表示,为啥还要搞个新的 StateListAnimator 呢?

原因是在 Android 5.0系统开始引入了新的 Material Design(纸墨设计) 规范,而在 纸墨设计规范中动画是非常重要的,通过各种动画来指导用户操作以及凸显重要的内容。 StateListDrawable 只是简单的状态切换,并没有动画所以不太符合 纸墨设计 规范的要求,因此从新设计了一个 StateListAnimator。

既然是一个 Animator ,就说明该类可以对 View 的属性做动画。

比如:(res/animator/selector_animator.xml)

<?xmlversion="1.0" encoding="utf-8"?> <selectorxmlns:android="http://schemas.android.com/apk/res/android">   <itemandroid:state_pressed="true">     <objectAnimator       android:duration="@android:integer/config_shortAnimTime"       android:propertyName="translationZ"       android:valueTo="4dp"       android:valueType="floatType"/>   </item>     <item>     <objectAnimator       android:duration="@android:integer/config_shortAnimTime"       android:propertyName="translationZ"       android:valueTo="0dp"       android:valueType="floatType"/>   </item> </selector>

根元素依然为 selector, 只不过该文件是在 animator 目录中的。每个 item 为一个 objectAnimator 对象 用来对 View 的属性做动画。 可以把这个文件设置到 View 的 stateListAnimator 属性上去:

android:stateListAnimator=”@animator/selector_animator”

效果如下:

StateListAnimator 介绍

另外值得说明的是,在 item 中不仅可以使用 objectAnimator 还可以使用多个 objectAnimator 来实现复杂的动画,多个 objectAnimator 放到一个 set 中:

<?xmlversion="1.0" encoding="utf-8"?> <selectorxmlns:android="http://schemas.android.com/apk/res/android">   <itemandroid:state_pressed="true">     <set>       <objectAnimator         android:duration="@android:integer/config_shortAnimTime"         android:propertyName="scaleX"         android:valueTo="1.025"         android:valueType="floatType"/>       <objectAnimator         android:duration="@android:integer/config_shortAnimTime"         android:propertyName="scaleY"         android:valueTo="1.025"         android:valueType="floatType"/>       <objectAnimator         android:duration="@android:integer/config_shortAnimTime"         android:propertyName="translationZ"         android:valueTo="4dp"         android:valueType="floatType"/>     </set>   </item>     <item>     <set>       <objectAnimator         android:duration="@android:integer/config_shortAnimTime"         android:propertyName="scaleX"         android:valueTo="1.0"         android:valueType="floatType"/>       <objectAnimator         android:duration="@android:integer/config_shortAnimTime"         android:propertyName="scaleY"         android:valueTo="1.0"         android:valueType="floatType"/>       <objectAnimator         android:duration="@android:integer/config_shortAnimTime"         android:propertyName="translationZ"         android:valueTo="0dp"         android:valueType="floatType"/>     </set>   </item>   </selector>

效果:

StateListAnimator 介绍


(责任编辑:ioter)

用户喜欢...

Android新特性介绍,ConstraintLayout完全解析

今天给大家带来2017年的第一篇文章,这里先祝大家新年好。 本篇文章的主题是ConstraintLayout。其实ConstraintLayout是Android Studio 2.2中主要的新增功能之一,也是Google在去年的I/O大会上重点宣传的...