欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android中的动画

程序员文章站 2024-03-26 08:13:11
...

1.分类

  • View动画
  • 帧动画
  • 属性动画

2.View动画

View动画的作用对象是View

支持四种效果: TranslateAnimation , ScaleAnimation , RotateAnimation , AlphaAnimation

定义:可以在代码中,也可以在xml文件中(建议)

需要在res目录下新建anim文件夹,对应的标签: set , translate , alpha , roatate , scale

使用: AnimationUtils.loadAnimation(context , id) -> Animation

调用: view.startAnimation();

自定义view动画: 继承Animation , 重写initialize() & applyTransformation() ; 可通过借助Camera来简化矩阵变化。

3.帧动画

帧动画是顺序播放一组预先定义好的图片,相关API: AnimationDrawable

需要在xml文件种定义: ,可作为View的背景 , 通过getBackground()获取AnimationDrawable实例。

4.View动画的特殊使用场景

  • LayoutAnimation
    作用于ViewGroup:子元素出场时的动画效果
    属性: delay:延迟 (0~1) 动画时长相乘 , 第一个动画1 , 第二个动画 2 ….
    animationOrder动画顺序 [normal , reverse , random] , animation 指定动画
    使用: xml中 layoutAnimation ; code 中 LayoutAnimationController.
  • Activity切换效果
    overridePendingTransition(int enterAinm , int exitAnim)
    生效的时期: startActivity() or finish()之后。

5.属性动画

常用类: ValueAnimator , ObjectAnimator , AnimatorSet

特点: 作用对象做了拓展 ; 对动画效果做了拓展

使用: xml 中 animator文件夹 ; code中 ObjectAnimator.ofFloat…

标签 : , , 对应 ValueAnimator

对任意属性做动画

如果想对Object的属性abc做动画,想要动画生效,需要满足两个条件:

  1. 必须提供getAbc() , setAbc()方法
  2. object的setAbc对属性abc所做的改变必须能够通过某种方式反映出来

对button的width属性做动画没有效果?

button内部提供了getWidth() , setWidth()方法

但setWidth()并不是改变视图的大小。

解决方法(三种):

  • 添加get和set方法,如果有权限的
    看似最简单,但不太可行
  • 用一个类包装原始对象,间接为其提供get和set方法
    定义ViewWrapper(demo)
    public class ViewWrapper {

          private View mTarget;

          public ViewWrapper(View mTarget) {
              this.mTarget = mTarget;
          }

          public int getWidth(){
              return mTarget.getLayoutParams().width;
          }

          public void setWidth(int width){
              mTarget.getLayoutParams().width = width;
              mTarget.requestLayout();
          }

      }
  • 采用ValueAnimator,监听动画的过程,自己实现属性的改变
    ValueAnimator valueAnimator = ValueAnimator.ofInt();
      valueAnimator.addUpdateListener(new AnimatorUpdateListener(){

          @override
          public void onAnimationUpdate(ValueAnimator animator){

          }

      })

6.注意事项

  1. OOM(帧动画)
  2. 内存泄漏(属性动画且无限循环,在Activity退出时及时停止)
  3. 兼容性问题