概述
Android中动画框架包含 ViewAnimation
,DrawableAnimation
,PropertyAnimation
,其中在新版本中还可使用Transition API完成一些绚丽动画.为了在新版本中使用更加好看的动画,可以作如下一些调整.
触觉反馈
在Android L上实现ripple
效果
- 在视图范围内展示波纹效果
android:background="?android:attr/selectableItemBackground"
- 波纹在接触点开始,之后填充整个视图背景
android:background="?android:attr/selectableItemBackgroundBorderless"
View Property Animator
API>12
引入View
的属性动画,此动画是并行执行动画,使用非常方便.
view.animate().x()...start();
为了兼容性,实现API >= 4
的ViewPropertyAnimator
,可使用ViewCompat
ViewCompat.animate(view).x()...;
- 实例
mButton.animate()
.alpha(1f)
//....
.setListener(new Animator.AnimatorListener() {
//...
})
.start();
- 注意
这里其实可以不用调用start方法,在链式调用结束,默认就会开启动画.
Object Animator
ObjectAnimator
可以通过代码和xml
生成,和 ViewPropertyAnimator
不同的是:
- 一个实例只能对单一属性执行动画
- 允许自定义属性的动画
- 我们可以使用
Evaluator
来计算动画执行中的属性值. - 同时可以使用
View
给我们提供好的Wrapper
属性,如View.SCALE_X
和View.SCALE_Y
- 可以使用
Interpolator
来定义动画的变化率.改变速度,加速度的行为
- 注意
这里有坐标x
,translationX
,他们的主要区别是
Y是绝对位置,TRANSLATION_Y是相对位置
Circular Reveal
使用剪切的圆形显示或隐藏一组 UI
元素,官方将这一动画称为揭露效果,可通过如下方式来创建:
//android.view.ViewAnimationUtils
createCircularReveal(View view,
int centerX, int centerY, float startRadius, float endRadius){
//...
}
窗口转换
在API>=21
起加入.可定制转换包括:
- enter – A调用,B的动画.
- exit - A调用B,A的动画.
- reenter – B返回A,A的动画.
- return – B返回A,B的动画.
设置方式:
getWindow().setEnterTransition(slide);
getWindow().setExitTransition(slide);
getWindow().setReenterTransition(slide);
getWindow().setReturnTransition(slide);
官方默认提供了Explode
,Slide
,Fade
三种变换.
通过如下方式开启
ActivityOptions transitionActivity =
ActivityOptions.makeSceneTransitionAnimation(xxxActivity.this);
startActivity(intent, transitionActivity.toBundle());
通过如下方式来结束
ActivityCompat.finishAfterTransition(this);
同时支持自定义的Content动画
,定义如下.
//自定义动画转换,和`overridePendingTransition`类似
ActivityOptionsCompat makeCustomAnimation(Context context,
int enterResId, int exitResId);
// 放大向上效果转换
ActivityOptionsCompat makeScaleUpAnimation(View source,
int startX, int startY, int startWidth, int startHeight);
//缩略图放大效果转换
ActivityOptionsCompat makeThumbnailScaleUpAnimation(View source,
Bitmap thumbnail, int startX, int startY);
//单个共享元素转换
ActivityOptionsCompat makeSceneTransitionAnimation(Activity activity,
View sharedElement, String sharedElementName);
//多个共享元素转换
ActivityOptionsCompat makeSceneTransitionAnimation(Activity activity,
Pair<View, String>... sharedElements);
窗口转换优化
改善上述转换效果,使执行的更加顺滑.包括如下一些方面
- 包括主题下设置
允许窗口页面转换
,设置windowContentTransitions
属性 - 启用/禁用转换重叠:
Overlap
属性 - 排除特定视图转换,加快过渡:
excludeId
属性 - 工具栏和操作栏,确保转换中的两个
Activity
使用相同的组件 - 转换持续时间,
200-500ms
最为合适
共享元素
如上第四种,第五种
提供了共享元素转换的方式,需要设置transitionName
来开启.也可以通过代码来设置
setSharedElementEnterTransition();
对于目标视图可以使用slide.addTarget(int id)
来设置入场动画.
Slide slide = new Slide(Gravity.BOTTOM);
slide.addTarget(R.id.view_separator);
slide.addTarget(R.id.text_detail);
slide.addTarget(R.id.text_close);
getWindow().setEnterTransition(slide);
关于这一小结可以查看泡网;
深入理解共享元素变换(Shared Element Transition)-上
自定义转换
主要步骤包括:
- 首先创建一个
SharedTransition
,传入压缩视图与转换名称以引用共享组件。 - 然后创建
ArcMotion
实例,使两个视图转换时形成曲线动画效果。 - 接下来扩展
ChangeBounds
以创建自定义转换.
AnimatedVectorDrawable
在API >= 21
用于生成VectorDrawable
属性的动画
定义vector
标签,用path
来绘制静态矢量图.
利用animated-vector
来定义VectorDrawable
的动画效果