Android 5.0之上可用动画总结

Android中动画框架包含 ViewAnimation,DrawableAnimation,PropertyAnimation,其中在新版本中还可使用Transition API完成一些绚丽动画.为了在新版本中使用更加好看的动画,可以作如下一些调整.

触觉反馈

在Android L上实现ripple效果

  • 在视图范围内展示波纹效果 
    android:background="?android:attr/selectableItemBackground"

  • 波纹在接触点开始,之后填充整个视图背景 
    android:background="?android:attr/selectableItemBackgroundBorderless"

当然也可以自定义ripple效果: 
可以参考:Android5.0以上为View点击添加Ripple波纹效果

View Property Animator

API>12引入View的属性动画,此动画是并行执行动画,使用非常方便.

view.animate().x()...start();
  • 1

为了兼容性,实现API >= 4 的ViewPropertyAnimator,可使用ViewCompat

ViewCompat.animate(view).x()...;
  • 1
  • 实例
mButton.animate()
        .alpha(1f)
        //....
        .setListener(new Animator.AnimatorListener() {
            //...
        })
        .start();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 注意 
    这里其实可以不用调用start方法,在链式调用结束,默认就会开启动画.

Object Animator

ObjectAnimator可以通过代码和xml生成,和 ViewPropertyAnimator不同的是:

  • 一个实例只能对单一属性执行动画
  • 允许自定义属性的动画

    1. 我们可以使用Evaluator来计算动画执行中的属性值.
    2. 同时可以使用View给我们提供好的Wrapper属性,如View.SCALE_X 和 View.SCALE_Y
    3. 可以使用 Interpolator来定义动画的变化率.改变速度,加速度的行为
  • 注意 
    这里有坐标x,translationX,他们的主要区别是

Y是绝对位置,TRANSLATION_Y是相对位置
  • 1

Circular Reveal

使用剪切的圆形显示或隐藏一组 UI 元素,官方将这一动画称为揭露效果,可通过如下方式来创建:

//android.view.ViewAnimationUtils
createCircularReveal(View view,
            int centerX,  int centerY, float startRadius, float endRadius){
//...
}
  • 1
  • 2
  • 3
  • 4
  • 5

关于更多Circular的介绍: 
使用Circular Reveal为你的应用添加揭露动画效果

窗口转换

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);
  • 1
  • 2
  • 3
  • 4

官方默认提供了Explode,Slide,Fade三种变换.

通过如下方式开启

ActivityOptions transitionActivity =
                ActivityOptions.makeSceneTransitionAnimation(xxxActivity.this);
startActivity(intent, transitionActivity.toBundle());
  • 1
  • 2
  • 3

通过如下方式来结束

ActivityCompat.finishAfterTransition(this);
  • 1

同时支持自定义的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);                       
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

关于更多Content Transition参考泡网的系列文章: 
Activity和Fragment Transition介绍

窗口转换优化

改善上述转换效果,使执行的更加顺滑.包括如下一些方面

  • 包括主题下设置允许窗口页面转换,设置windowContentTransitions属性
  • 启用/禁用转换重叠:Overlap属性
  • 排除特定视图转换,加快过渡: excludeId属性
  • 工具栏和操作栏,确保转换中的两个Activity使用相同的组件
  • 转换持续时间,200-500ms最为合适

参考: 
探索安卓中有意义的动画!

共享元素

如上第四种,第五种提供了共享元素转换的方式,需要设置transitionName来开启.也可以通过代码来设置

setSharedElementEnterTransition();
  • 1

对于目标视图可以使用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);
  • 1
  • 2
  • 3
  • 4
  • 5

关于这一小结可以查看泡网; 
深入理解共享元素变换(Shared Element Transition)-上

自定义转换

主要步骤包括:

  • 首先创建一个 SharedTransition,传入压缩视图与转换名称以引用共享组件。
  • 然后创建 ArcMotion 实例,使两个视图转换时形成曲线动画效果。
  • 接下来扩展 ChangeBounds 以创建自定义转换.

关于更多ArcMotion的介绍: 
ArcMotion API

AnimatedVectorDrawable

API >= 21用于生成VectorDrawable属性的动画 
定义vector标签,用path来绘制静态矢量图. 
利用animated-vector 来定义VectorDrawable的动画效果

关于更多VectorDrawable的介绍: 
Android VectorDrawable与SVG

Android实现炫酷SVG动画效果

参考:

Exploring Meaningful Motion on Android

Android VectorDrawable与SVG

酷炫的Activity切换动画,打造更好的用户体验

学习demo:AndroidAnimations


android5.0之Activity过渡动画

android5.0之Activity过渡 动画Android5.0提供了3种Transition类型。 进入 动画:一个进入的过渡 动画决定一个Activity中的所有视图怎么进入屏幕。 退出 动画:一个退...

Android中动画框架包含 ViewAnimation,DrawableAnimation,PropertyAnimation,其中在新版本中还可使用Transition API完成一些绚丽动画.为了在新版本中使用更加好看的动画,可以作如下一些调整.

触觉反馈

在Android L上实现ripple效果

  • 在视图范围内展示波纹效果 
    android:background="?android:attr/selectableItemBackground"

  • 波纹在接触点开始,之后填充整个视图背景 
    android:background="?android:attr/selectableItemBackgroundBorderless"

当然也可以自定义ripple效果: 
可以参考:Android5.0以上为View点击添加Ripple波纹效果

View Property Animator

API>12引入View的属性动画,此动画是并行执行动画,使用非常方便.

view.animate().x()...start();
  • 1

为了兼容性,实现API >= 4 的ViewPropertyAnimator,可使用ViewCompat

ViewCompat.animate(view).x()...;
  • 1
  • 实例
mButton.animate()
        .alpha(1f)
        //....
        .setListener(new Animator.AnimatorListener() {
            //...
        })
        .start();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 注意 
    这里其实可以不用调用start方法,在链式调用结束,默认就会开启动画.

Object Animator

ObjectAnimator可以通过代码和xml生成,和 ViewPropertyAnimator不同的是:

  • 一个实例只能对单一属性执行动画
  • 允许自定义属性的动画

    1. 我们可以使用Evaluator来计算动画执行中的属性值.
    2. 同时可以使用View给我们提供好的Wrapper属性,如View.SCALE_X 和 View.SCALE_Y
    3. 可以使用 Interpolator来定义动画的变化率.改变速度,加速度的行为
  • 注意 
    这里有坐标x,translationX,他们的主要区别是

Y是绝对位置,TRANSLATION_Y是相对位置
  • 1

Circular Reveal

使用剪切的圆形显示或隐藏一组 UI 元素,官方将这一动画称为揭露效果,可通过如下方式来创建:

//android.view.ViewAnimationUtils
createCircularReveal(View view,
            int centerX,  int centerY, float startRadius, float endRadius){
//...
}
  • 1
  • 2
  • 3
  • 4
  • 5

关于更多Circular的介绍: 
使用Circular Reveal为你的应用添加揭露动画效果

窗口转换

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);
  • 1
  • 2
  • 3
  • 4

官方默认提供了Explode,Slide,Fade三种变换.

通过如下方式开启

ActivityOptions transitionActivity =
                ActivityOptions.makeSceneTransitionAnimation(xxxActivity.this);
startActivity(intent, transitionActivity.toBundle());
  • 1
  • 2
  • 3

通过如下方式来结束

ActivityCompat.finishAfterTransition(this);
  • 1

同时支持自定义的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);                       
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

关于更多Content Transition参考泡网的系列文章: 
Activity和Fragment Transition介绍

窗口转换优化

改善上述转换效果,使执行的更加顺滑.包括如下一些方面

  • 包括主题下设置允许窗口页面转换,设置windowContentTransitions属性
  • 启用/禁用转换重叠:Overlap属性
  • 排除特定视图转换,加快过渡: excludeId属性
  • 工具栏和操作栏,确保转换中的两个Activity使用相同的组件
  • 转换持续时间,200-500ms最为合适

参考: 
探索安卓中有意义的动画!

共享元素

如上第四种,第五种提供了共享元素转换的方式,需要设置transitionName来开启.也可以通过代码来设置

setSharedElementEnterTransition();
  • 1

对于目标视图可以使用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);
  • 1
  • 2
  • 3
  • 4
  • 5

关于这一小结可以查看泡网; 
深入理解共享元素变换(Shared Element Transition)-上

自定义转换

主要步骤包括:

  • 首先创建一个 SharedTransition,传入压缩视图与转换名称以引用共享组件。
  • 然后创建 ArcMotion 实例,使两个视图转换时形成曲线动画效果。
  • 接下来扩展 ChangeBounds 以创建自定义转换.

关于更多ArcMotion的介绍: 
ArcMotion API

AnimatedVectorDrawable

API >= 21用于生成VectorDrawable属性的动画 
定义vector标签,用path来绘制静态矢量图. 
利用animated-vector 来定义VectorDrawable的动画效果

关于更多VectorDrawable的介绍: 
Android VectorDrawable与SVG

Android实现炫酷SVG动画效果

参考:

Exploring Meaningful Motion on Android

Android VectorDrawable与SVG

酷炫的Activity切换动画,打造更好的用户体验

学习demo:AndroidAnimations

猜你喜欢

转载自blog.csdn.net/pangjl1982/article/details/80893050