Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >让View跟随状态动起来——StateListAnimator

让View跟随状态动起来——StateListAnimator

作者头像
用户1108631
发布于 2019-08-17 04:41:49
发布于 2019-08-17 04:41:49
1.9K00
代码可运行
举报
运行总次数:0
代码可运行

StateListAnimator定义了一组动画,可以根据View drawable的状态进行不同的切换。所谓状态指的是statepressed、stateenabled等这些状态。 Android提供的drawable中,其中有一种就是selector,只不过那种是指定的图片,而StateListAnimator指定的动画。 不说废话,先看下效果:

使用StateListAnimator

StateListAnimator主要就是定义不同状态下的动画,主要有三种方式可以实现:

  1. 完全xml定义动画以及设置
  2. xml定义动画+代码设置
  3. 代码定义动画以及设置

下面分别介绍。

xml定义动画以及设置

在res/animator下创建动画文件,根标签selector,然后定义每种状态下的动画,demo中左上角的动画就是这么定义的,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android">    <item android:state_pressed="true">        <set>            <objectAnimator                android:duration="@android:integer/config_shortAnimTime"                android:propertyName="scaleX"                android:repeatCount="10"                android:repeatMode="restart"                android:valueFrom="1.0"                android:valueTo="1.5"                android:valueType="floatType"/>            <objectAnimator                android:duration="@android:integer/config_shortAnimTime"                android:propertyName="scaleY"                android:repeatCount="10"                android:repeatMode="restart"                android:valueFrom="1.0"                android:valueTo="1.5"                android:valueType="floatType"/>        </set>    </item>    <!-- the default, non-pressed state; set x and y size to 100% -->    <item android:state_pressed="false">        <set>            <objectAnimator                android:duration="@android:integer/config_shortAnimTime"                android:propertyName="scaleX"                android:valueTo="1"                android:valueType="floatType"/>            <objectAnimator                android:duration="@android:integer/config_shortAnimTime"                android:propertyName="scaleY"                android:valueTo="1"                android:valueType="floatType"/>        </set>    </item></selector>

主要定义了在按住状态下的缩放动画,重复10次;正常状态下恢复到正常状态。定义好了动画后,只需在xml中使用stateListAnimator进行设置,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<ImageView        android:clickable="true"        android:src="@drawable/pic_11"        android:stateListAnimator="@animator/anim_list_state_scale"        />

需要注意的是,使用了state_pressed状态后,如果这个View默认是不支持点击的,比如自定义View、ImageView等,那么还需要添加clickable=true,不然是没有效果的,切记切记。

xml定义动画+代码设置

demo中右上的动画,就是这种方式,xml定义动画和上面一样,就不多bb了,代码设置如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        cardView.stateListAnimator=AnimatorInflater.loadStateListAnimator(this,R.animator.card_smooth_shadow)

代码定义动画以及设置

demo中心动的感觉就是通过这种方式设置的,纯代码定义动画。动画效果也是在按下去的时候进行一个无限循环的缩放,正常状态下恢复到正常状态。 代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
val xPressedAnim = ObjectAnimator.ofFloat(ivLike, View.SCALE_X, 1.0f, 1.5f).apply {            duration = 1000            repeatMode = ValueAnimator.REVERSE            repeatCount = ValueAnimator.INFINITE        }        val yPressedAnim = ObjectAnimator.ofFloat(ivLike, View.SCALE_Y, 1.0f, 1.5f).apply {            duration = 1000            repeatMode = ValueAnimator.REVERSE            repeatCount = ValueAnimator.INFINITE        }        val xNormalAnim = ObjectAnimator.ofFloat(ivLike, View.SCALE_X, 1.0f).apply {            duration = 1000        }        val yNormalAnim = ObjectAnimator.ofFloat(ivLike, View.SCALE_Y, 1.0f).apply {            duration = 1000        }
        val pressedAnim = AnimatorSet().apply {            play(xPressedAnim).with(yPressedAnim)        }        val normalAnim = AnimatorSet().apply {            play(xNormalAnim).with(yNormalAnim)        }        //这个不能少,否则没有效果        ivLike.isClickable=true        ivLike.stateListAnimator = StateListAnimator().apply {            addState(intArrayOf(android.R.attr.state_pressed), pressedAnim)        //负数表示该状态为false         addState(intArrayOf(-android.R.attr.state_pressed), normalAnim)        }

代码其实挺简单的,StateListAnimator定义后,通过addState()指定某些方法下的动画,状态都是在android.R.attr.state_XXX下,每种状态有true或者false,如果需要加上false,需要在值前面加上负号就可以了,如上面的代码。

总结

StateListAnimator的创建主要有三种方式,而根本还是属性动画的定义,因此属性动画才是关键。

参考

  • https://developer.android.com/guide/topics/graphics/prop-animation?hl=zh-cn#ViewState
  • https://developer.android.com/reference/android/animation/StateListAnimator?hl=zh-cn
  • https://android.jlelse.eu/polishing-ui-android-statelistanimator-7b74a06b85a5
  • https://blog.stylingandroid.com/statelistanimator/
  • https://blog.stylingandroid.com/animatedstatelistdrawable/
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-03-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 每天学点Android知识 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Android 动画总结(5) - 属性动画
属性动画改变属性值,所以几乎可以对任何对象执行动画,而不仅仅是 View,比起补间动画,适用范围更广。
三流之路
2018/09/11
9360
自定义View(六)-动画- AnimatorSet与XML设置属性动画
AnimatorSet是组合动画,前面在ObjectAnimator.ofPropertyValuesHolder(),时也可以做到控制多个属性做动画,但是.ofPropertyValuesHolder(),仅仅是将多个属性同时做动画却无法灵活控制每个属性的播放顺序,针对的是一个控件,而AnimatorSet是组合动画。更侧重的是在多个动画播放时对动画的控制(可以控制动画的顺序,延时,同时可以控制多个控件的动画等等)。
g小志
2018/09/11
1.5K0
自定义View(六)-动画- AnimatorSet与XML设置属性动画
【Android】属性动画(基本用法)
1、前言 在我们体验一款APP时,炫酷的动画往往能让用户体验大幅度提升。想当年我刚学Android的时候,无意中看到蘑菇街购物车的动画效果,把我给激动得,非要在自己的APP中加入那动画,记得当时用费了好大的劲...不提了,说多了都是泪... 先了解下,目前可以实现动画的方式有: 帧动画(Frame) :将一个完整的动画拆分成一张张单独的图片,然后再将它们连贯起来进行播放 特点:帧动画 由于是一帧一帧的,所以需要图片多。会增大apk的大小,但是这种动画可以实现一些比较难的效果 比如说等待的环形进度 补
Gavin-ZYX
2018/05/18
1.5K0
仿抖音发布按住拍呼吸效果
上面两个按钮,都是采用属性动画进行控制的,但实现细节稍有不同,左上采用的是StateListAnimator,只需要考虑跟随手指动就可以了;右下是在onTouch里面控制动画开启or关闭。 demo采用了自定义View的方式,重点有几点:
用户1108631
2019/08/17
7560
Android十八章:属性动画Android属性动画(第一话)
Android动画能给界面带来很炫的效果,如果我们要实现这些效果,在android3.0版本前实现动画主要有2种方式,帧动画和补间动画。
ppjun
2018/09/05
1.1K0
Android入门之动画
Android动画 AlphaAnimation RelativeLayout rl_splash = (RelativeLayout) findViewById(R.id.rl_splash); //播放动画效果 AlphaAnimation animation = new AlphaAnimation(1.0f, 0.0f); //设置Alpha动画的持续时间 animation.setDuration(2000); //播放Alpha动画 rl_splash.setAnimation(animati
xiangzhihong
2018/01/26
8000
初识属性动画——使用Animator创建动画
ViewAnimation只支持几种动画:scale、transition、rotate、alpha四种类型。并且缺陷是只是改变了显示位置,实际位置并没有改变。 一个demo解释一切,如下图:
用户1108631
2019/08/17
7310
Android属性动画完全解析(上),初识属性动画的基本用法
用户1158055
2018/01/05
1.7K0
Android属性动画完全解析(上),初识属性动画的基本用法
Android 中的属性动画 --- 1(基本用法)
动画在提高用户体验里面起了巨大的作用,可以说是提高用用户体验的“主力军”。在 Android 3.0 之前,视图动画几乎承担了所有的动画效果,但是视图动画有一个很大的局限性:它改变的只是某个 View 的外观。但是响应事件位置并没有随着 View 的改变而改变。举个 case 来说,现在有一个按钮通过视图动画在 x 轴方向上向右移动了 200 px(像素) 的距离,按钮显示的位置虽然改变了,但是点击移动后的按钮并不能相应点击事件,只有点击这个按钮没有移动之前的位置才能响应这个按钮的点击事件。由于这个巨大的局限性,Google 在 Android 3.0 以上添加了一个新的动画框架:属性动画。下面来一起看一下属性动画的用法:
指点
2019/01/18
1.2K0
Android 中的属性动画 --- 1(基本用法)
动画必须有(一): 属性动画浅谈
前言 官方文档传送门 属性动画是非常非常好用的, 谷歌自己都说这是一个强大的框架. 那今天就来了解一下它. ObjectAnimator的初步使用 属性动画最大的特点就是可以让任何Object动起来, 我先给个小栗子, 大家感受一下. TextView tvTest = (TextView) findViewById(R.id.tv_test); float curTranslationY = tvTest.getTranslationY(); ObjectAnimator animator
sean_yang
2018/09/04
7300
动画必须有(一): 属性动画浅谈
A013-animator资源
上一节课介绍了关于anim资源的知识点,这节课来给大家介绍animator资源,它跟anim资源同样是res下在资源,它是另外一种动画资源,上节课讲的是View Animation,是Android3.0之前使用较多的动画方式,然而Android 3.0推出之后,也带给我们一种新的动画实现方式——Property Animation(属性动画),它们有什么不一样的地方? 不同点: View Animation技术较老,只能作用于View Property Animation技术相对较新,可以作用于任何对象,
巫山老妖
2018/07/20
2970
android动画解析(初级)
ObjectAnimator继承自ValueAnimator的,底层的动画实现机制也是基于ValueAnimator来完成的,因此ValueAnimator仍然是整个属性动画当中最核心的一个类。那么既然是继承关系,说明ValueAnimator中可以使用的方法在ObjectAnimator中也是可以正常使用的,它们的用法也非常类似.
方志朋
2022/11/30
4970
深入分析Android动画(一)
  View动画顾名思义其作用对象为View,包含平移、缩放、旋转、透明,这四类变化分别对应着Animation的子类TranlateAnimation、ScaleAnimation、RotateAnimation和AlphaAnimation。虽然有对应的类,不过,在Android动画中,还是建议用XML来定义,其对应的标签如下所示
LoveWFan
2018/08/07
3730
深入分析Android动画(一)
Android动画分析
Android动画可以分3种:View动画,帧动画和属性动画;属性动画为API11的新特性,在低版本是无法直接使用属性动画的,但可以用nineoldAndroids来实现(但是本质还是viiew动画)。学习本篇内容主要掌握以下知识:
xiangzhihong
2022/11/30
9060
Android动画深入分析
动画分类 Android动画可以分3种:View动画,帧动画和属性动画;属性动画为API11的新特性,在低版本是无法直接使用属性动画的,但可以用nineoldAndroids来实现(但是本质还是viiew动画)。学习本篇内容主要掌握以下知识: 1,View动画以及自定义View动画。 2,View动画的一些特殊使用场景。 3,对属性动画做了一个全面的介绍。 4,使用动画的一些注意事项。 view动画 View动画的四种变换效果对应着Animation的四个子类:TranslateAnimation(平移动
xiangzhihong
2018/02/05
8490
Android 属性动画:这是一篇很详细的 属性动画 总结&攻略
实现动画效果在Android开发中非常常见,因此Android系统一开始就提供了两种实现动画的方式:
Carson.Ho
2019/02/22
4K0
Android中的动画全解!
View动画的平移、缩放、旋转、透明度 分别对应 Animation的的4个子类:TranslateAnimation、ScaleAnimation、RotateAnimation、AlphaAnimation。View可以用xml定义、也可以用代码创建。推荐使用xml,可读性好。
胡飞洋
2020/07/23
2.3K0
Android中的动画全解!
Android 动画笔记
属性动画几乎可以实现任何想要的动画效果,非常具有可扩展性并且非常稳健。属性动画可供设定的选项包括了:
zhiruili
2023/10/20
2370
Android 动画笔记
Android开发之漫漫长途 XVII——动画(续)
该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列。该系列引用了《Android开发艺术探索》以及《深入理解Android 卷Ⅰ,Ⅱ,Ⅲ》中的相关知识,另外也借鉴了其他的优质博客,在此向各位大神表示感谢,膜拜!!!
LoveWFan
2018/08/21
2820
Android样式的开发:Style篇
前面铺垫了那么多,终于要讲到本系列的终篇,整合所有资源,定义成统一的样式。 哪些该定义成统一的样式呢?举几个例子吧:
Keegan小钢
2018/08/10
1.5K0
相关推荐
Android 动画总结(5) - 属性动画
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验