能创建Android的三类动画
能创建Android的三类动画
打开Android Studio,新建一个空Activity,类动画你其实已经站在了三岔路口。类动画动画不是类动画“加个特效”那么简单——它决定了用户手指划过屏幕时,眼睛和大脑能不能被说服。类动画我翻过不少项目代码,类动画发现很多人只用了其中一类,类动画另外两类要么不会,类动画要么懒得碰。类动画结果就是类动画界面“能用”,但总觉得哪里卡着一口气。类动画
第一类:View动画(补间动画)——老派但够快
View动画也叫补间动画(Tween Animation),类动画它只负责画“影子”。类动画你给一个按钮设置透明、类动画旋转、类动画缩放或平移,系统会在画布上重新绘制这个按钮的副本,而按钮本身的位置和属性纹丝不动。比如点击后让按钮淡出,用AlphaAnimation(1, 0),两行代码搞定。但坑也在这:动画结束后按钮还在原地,点击事件也还认原来的坐标。我见过有人做列表项侧滑删除,用View动画把条目移出屏幕,结果手指一碰屏幕边缘,那个“消失”的条目还能响应点击——像幽灵一样。
不过View动画有个隐藏优势:它不依赖硬件加速,跑在低端机上也不容易掉帧。做个简单的加载旋转图标,或者对话框弹入弹出,它依然是最省心的选择。
第二类:属性动画——真正改变“本体”
属性动画(Property Animation)从API 11开始出现,它不画影子,直接改对象的属性。比如你想让一个ImageView从左边滑到右边,用ObjectAnimator.ofFloat(imageView, "translationX", 0f, 500f),动画跑完,imageView的translationX真的变成了500。点击事件也跟着走,不会出现幽灵点击。
我印象很深的一次调试:同事用View动画做折叠菜单,展开后菜单项点不了。换成属性动画,把rotation和translationY一起动,问题消失。属性动画的代价是代码量稍大,而且如果频繁创建ObjectAnimator,容易触发GC。但它的灵活性无可替代——你可以动任何有getter/setter的属性,甚至自定义一个TypeEvaluator来控制颜色渐变路径。
有个细节:属性动画默认的插值器是AccelerateDecelerateInterpolator,先快后慢再快,看起来有点“犹豫”。做弹出菜单时我习惯换成DecelerateInterpolator,收尾更干脆。
第三类:Transition动画——场景切换的粘合剂
Transition框架(Android 4.4引入,5.0完善)解决的是“两个场景之间怎么过渡”。比如Activity A跳转到Activity B,共享同一个图片。以前你得手动算坐标、做缩放,现在用SharedElementTransition,系统自动帮你把图片从A的位置和大小,平滑过渡到B的位置和大小。我试过在RecyclerView里点缩略图打开详情页,配合changeImageTransform和changeBounds,效果像原生相册。
但Transition的坑在于:它依赖场景根布局的transitionName,而且如果两个Activity的主题不一致,或者B页面还没测量完就启动动画,会闪一下。我通常会在B的onCreate里调用postponeEnterTransition(),等图片加载完再startPostponedEnterTransition()。这招能骗过大多数低端机。
另外,Transition不只能做Activity跳转。在同一个布局里,用TransitionManager.beginDelayedTransition()包裹视图变化,比如把LinearLayout换成ConstraintLayout,或者改变某个View的visibility,系统会自动补间。我拿它做过设置页的“高级选项”展开,比手动写属性动画省了三十行代码。
选哪个?看你要骗眼睛还是骗手指
View动画骗眼睛,属性动画骗手指,Transition骗整个场景。我自己的习惯:简单图标动效用View动画,交互反馈用属性动画,页面跳转或复杂布局变化用Transition。别指望一个框架通吃——Android动画系统本来就是个工具箱,不是一把瑞士军刀。
最后说个真事:有次我帮人改一个“卡顿”的动画,他把属性动画的duration设成了2000毫秒,还加了repeatCount = INFINITE。我问他为什么,他说“这样看起来更流畅”。我关掉重复,把时长改成300毫秒,他盯着屏幕说:“好像……变快了?”不是变快了,是终于不折磨眼睛了。
(责任编辑:休闲)














