动画必须有(一): 属性动画浅谈
目录
- 前言
- ObjectAnimator的初步使用
- 用AnimatorSet进行动画混合
- 将动画写在xml中
- 动画监听
- ViewPropertyAnimator上手
- 最后
前言
属性动画是非常非常好用的, 谷歌自己都说这是一个强大的框架. 那今天就来了解一下它.
ObjectAnimator的初步使用
属性动画最大的特点就是可以让任何Object动起来, 我先给个小栗子, 大家感受一下.
TextView tvTest = (TextView) findViewById(R.id.tv_test); float curTranslationY = tvTest.getTranslationY(); ObjectAnimator animator = ObjectAnimator.ofFloat(tvTest, "translationY", curTranslationY, curTranslationY + 100f); animator.setDuration(2000); animator.start();
属性动画有个很重要的点就是说, 动画过后, 控件本身真的就变换了, 而不单单是绘制出了效果.
然后这里
ofFloat()
函数的第一个参数自然是控件了, 第二个参数是可以填入很多的, 比如"alpha", "rotation", 到底有多少, 大家可以移步官方文档. 然后后面的参数根据第二个参数来, 可多个, 这里可能说的不太清晰, 所以我们再来一个小栗子.
TextView tvTest = (TextView) findViewById(R.id.tv_test); ObjectAnimator animator = ObjectAnimator.ofFloat(tvTest, "alpha", 1f, 0f, 1f, 0f, 1f, 0f, 1f); animator.setDuration(2000); animator.start();
用AnimatorSet进行动画混合
一般来说, 让人感觉舒服的动画都不会是单一变换的动画, 肯定要各种动画混合一起, 来达到某种效果. 我这里进行一些混合的尝试, 顺便再展示几种动画.
// 垂直移动 float curTranslationY = tvTest.getTranslationY(); ObjectAnimator translationY = ObjectAnimator.ofFloat(tvTest, "translationY", curTranslationY, curTranslationY + 500f); ObjectAnimator scaleY = ObjectAnimator.ofFloat(tvTest, "scaleY", 1f, 5f, 1f); ObjectAnimator scaleX = ObjectAnimator.ofFloat(tvTest, "scaleX", 1f, 5f, 1f); AnimatorSet animSet = new AnimatorSet(); animSet.play(scaleY).with(scaleX).after(translationY); animSet.setDuration(2000); animSet.start();
这里就是将垂直移动动画, 水平缩放和垂直缩放混合在一起, 大家肯定发现了,
play()
,with()
,after()
这几个函数.
- after(Animator anim) after中的动画先执行, 之后才是play中的动画.
- after(long delay) after中设置时间, 那么play中的动画会根据时间延迟执行.
- before(Animator anim) before中的动画后执行, play中的先执行.
- with(Animator anim) play中的动画和with中的一同执行.
- playTogether() 中间可以放入要一起执行的全部动画, 之后不可接after(), before()这些函数. 来个小栗子.
AnimatorSet animSet = new AnimatorSet(); animSet.playTogether(translationY, scaleX, scaleY); animSet.setDuration(2000); animSet.start();
将动画写在xml中
写在xml中的好处不言而喻了, 复用性极强. 直接贴代码了, 很好理解的.
<set xmlns:android="http://schemas.android.com/apk/res/android" android:ordering="sequentially"> <objectAnimator android:duration="1000" android:propertyName="translationY" android:valueFrom="0" android:valueTo="500" android:valueType="floatType" /> <set android:ordering="sequentially"> <objectAnimator android:duration="1000" android:propertyName="rotation" android:valueFrom="0" android:valueTo="360" android:valueType="floatType" /> <set android:ordering="together"> <objectAnimator android:duration="1000" android:propertyName="scaleX" android:valueFrom="1" android:valueTo="5" android:valueType="floatType" /> <objectAnimator android:duration="1000" android:propertyName="scaleY" android:valueFrom="1" android:valueTo="5" android:valueType="floatType" /> </set> </set> </set>
然后使用如下代码调用xml动画.
AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(getApplicationContext(), R.animator.anim_set); set.setTarget(tvTest); set.start();
动画监听
动画监听是很有必要知道的, 我们是在做软件, 不是在做电影, 不能让它一个劲播下去. 先看一个比较全面的监听.
translationY.addListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animation) { } @Override public void onAnimationEnd(Animator animation) { } @Override public void onAnimationCancel(Animator animation) { } @Override public void onAnimationRepeat(Animator animation) { } });
这个很麻烦啦, 所以有适配版本的监听. 如果你用Android Studio它会弹出框让你选择.
translationY.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); } });
ViewPropertyAnimator上手
属性动画是谷歌在android3.0引入的, 而ViewPropertyAnimator则是3.1引入的, 这个ViewPropertyAnimator绝对可以说是个磨人的小妖精, 它绝对会让你爱上属性动画的, 看个栗子:
tvTest.animate().translationY(curTranslationY + 500) .scaleX(5).scaleY(5) .setDuration(1000);
用ViewPropertyAnimator的目的就是精简代码以及快速实现, 想要处理一些复杂的动画, 还是要用上一篇说的内容慢慢来的(滑稽脸).
我们稍微修改一点代码, 看看新效果.
tvTest.animate().translationYBy(250) .scaleX(5).scaleY(5) .setDuration(1000);
其实可以看函数就看得出来意思了, 不加By代表直接移动某个值, 加了By代表在原有基础上移动某个值.
好, 我们再来看一个及其经典的代码, 可以完美展现出ViewPropertyAnimator的精简好用:
view.animate()// 获取ViewPropertyAnimator对象 // 动画持续时间 .setDuration(5000) // 透明度 .alpha(0) .alphaBy(0) // 旋转 .rotation(360) .rotationBy(360) .rotationX(360) .rotationXBy(360) .rotationY(360) .rotationYBy(360) // 缩放 .scaleX(1) .scaleXBy(1) .scaleY(1) .scaleYBy(1) // 平移 .translationX(100) .translationXBy(100) .translationY(100) .translationYBy(100) .translationZ(100) .translationZBy(100) // 更改在屏幕上的坐标 .x(10) .xBy(10) .y(10) .yBy(10) .z(10) .zBy(10) // 插值器 .setInterpolator(new BounceInterpolator())//回弹 .setInterpolator(new AccelerateDecelerateInterpolator())//加速再减速 .setInterpolator(new AccelerateInterpolator())//加速 .setInterpolator(new DecelerateInterpolator())//减速 .setInterpolator(new LinearInterpolator())//线性 // 动画延迟 .setStartDelay(1000) //是否开启硬件加速 .withLayer() // 监听 .setListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animation) { } @Override public void onAnimationEnd(Animator animation) { } @Override public void onAnimationCancel(Animator animation) { } @Override public void onAnimationRepeat(Animator animation) { } }) .setUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { } }) .withEndAction(new Runnable() { @Override public void run() { } }) .withStartAction(new Runnable() { @Override public void run() { } });
所以日常动画用它就足够了.
最后
有了属性动画, 界面就不会很死板了. 而且由于属性动画的特性, 让它可以完成动画部分的事, 甚至可以完成很多界面交互上的事. 喜欢记得点赞或者关注我哦.

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Android RecyclerView增加头部Header和尾部Footer,并实现Item分组
Android RecyclerView增加头部Header和尾部Footer,并实现Item分组 如图所示: 在Android的RecyclerView上实现增加若干头部Header和若干尾部Footer,关键是利用ViewType的类型,然后由本例的抽象类Item返回的类型加载不同的ViewHolder。 代码: package app.zhangphil.exp; import android.graphics.Color; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import androi...
- 下一篇
Android手势操作耍起来!
目录 前言 初步了解手势操作 六个重写方法 小栗子体验一下 别忘了双击事件 最后 前言 手势操作是Android交互当中至关重要的. 可以说, 如果一个软件没有好的手势操作, 就不能将其定义为移动端的软件. 这里来看下谷歌提供的GestureDetector类. 搭配属性动画使用, 效果更好哦. 初步了解手势操作 先来一段可以快速了解手势操作类的代码. 这里用到了GestureDetector.SimpleOnGestureListener(), 可以暂时理解为是一个适配器, 快速实现GestureDetector.OnGestureListener接口中要实现的方法. 这样的话, 你就可以按需实现, 不用全部重写所有方法. public class MainActivity extends AppCompatActivity { private GestureDetector mGestureDetector; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Windows10,CentOS7,CentOS8安装Nodejs环境
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8安装Docker,最新的服务器搭配容器使用
- 设置Eclipse缩进为4个空格,增强代码规范
- Docker快速安装Oracle11G,搭建oracle11g学习环境