Android动画学习总结

Android动画学习总结

一、Android动画分类:

  • View动画:场景里的View不断的做变换(平移、旋转、拉伸、透明度)产生的动画效果;
  • 帧动画:按顺序播放一系列图像产生的效果;
  • 属性动画:Android3.0开始增加的一种动画效果,通过动态改变View对象的属性值实现。

二、View动画:

  • View动画分为TranslateAnimation、RotateAnimation、ScaleAnimation、AlphaAnimation四类,每一类都有其各自的属性,具体可以查看官方文档,强烈建议使用XML来定义View动画,简单方便,可读性高,下面说明四类动画在XML中的表现形式:

    • TranslateAnimation—<translate>
    • RotateAnimation—<rotate>
    • ScaleAnimation—<scale>
    • AlphaAnimation—<alpha>
  • 下面是View动画的定义://res.anim.customize_anim.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
     android:interpolator="@android:anim/accelerate_decelerate_interpolator"
     android:duration="3000"
     android:repeatMode="reverse"
     android:fillAfter="true"
     android:startOffset="300"
     android:shareInterpolator="true">
    <translate
            android:fromYDelta="100"
            android:fromXDelta="100"
            android:toYDelta="500"
            android:toXDelta="500" />
    <rotate
            android:fromDegrees="0"
            android:toDegrees="90"
            android:pivotX="0"
            android:pivotY="0" />
    <scale
            android:duration="300"
            android:fromXScale="2.0"
            android:fromYScale="2.0"
            android:pivotX="50%p"
            android:pivotY="50%p"
            android:toXScale="1.0"
            android:toYScale="1.0" />
    <alpha
            android:fromAlpha="0"
            android:toAlpha="1" />
    <set><!--在此定义子动画集--></set>
</set>
  • 除了四类View动画特有属性外,还有几个公用属性:

    • android:duration(动画持续时间)
    • android:fillAfter(动画结束后是否停留在结束位置,true:结束位置,false:初始位置)
    • android:interpolator(动画插值器)
    • android:repeatMode(动画重复模式)
    • android:startOffset(动画延迟时间,单位:ms,默认300ms)
    • android:shareInterpolator(动画集是否共享插值器)

    定义好View动画后,下面就是应用动画了:

Animation animation = AnimationUtils.loadAnimation(getApplicationContext(),R.anim.customize_anim);
animation.setAnimationListener(new Animation.AnimationListener() {  //监听动画过程
            @Override
            public void onAnimationStart(Animation animation) {
            }
            @Override
            public void onAnimationEnd(Animation animation) {
            }
            @Override
            public void onAnimationRepeat(Animation animation) {
            }
        });
imageView.startAnimation(animation);
 如上,可以对动画添加监听过程。
  • 自定义View动画过程:
    a、继承抽象类Animation,重写initialize()、applyTransformation()方法
    b、initialize()进行初始化操作
    c、applyTransformation()进行相应的矩阵变换实现动画效果,使用Camera可以简化矩阵变换过程

  • 帧动画:
    系统提供AnimationDrawable来使用动画,因其是顺序播放一组图片来实现动画,特别消耗内存,并且容易引起OOM,所以不建议使用。

  • View动画特殊使用场景
    View动画可以应用于ViewGroup场景,用于控制子控件的出场效果,常见的有ListView和Activity的切换效果等,具体实现在此不做详细说明。

三、属性动画

  • 属性动画是Api 11加入的新特性,要想兼容Api 11以下版本,可以使用开源库nineoldandroids实现,该开源库的使用和原生的属性动画的使用完全一致。属性动画不再局限于View的变换,它可以实现任意属性值的变化,进而形成动画效果,常用的类有ObjectAnimation、ValueAnimation、AnimationSet等,其中AnimationSet是动画集合,ObjectAnimation是ValueAnimation的子类,属性动画的简单使用示例:
  ObjectAnimator animator = ObjectAnimator.ofFloat(imageView,"translationY",200);
        animator.setRepeatMode(ValueAnimator.RESTART);
        animator.setRepeatCount(3);
        animator.setEvaluator(new IntEvaluator());
        animator.setInterpolator(new AccelerateDecelerateInterpolator());
        animator.start();
  • 插值器
    • 插值器是根据时间流逝的百分比计算出当前属性值改变的百分比,系统提供LinearInterpolator(线性插值器,匀速动画)、AccelerateDecelerateInterpolator(加减速插值器,根据cos()函数实现)、DecelerateAccerateInterpolator(减加速插值器,根据sin()函数实现)、DecelerateInterpolator(减速插值器)等,可以实现自定义插值器,只需实现TimeInterpolator接口或者Interpolator接口即可。
  • 估值器
    • 类似于插值器,估值器是根据当前属性值改变的百分比计算出改变后的属性值,系统提供IntEvaluator(Int型属性估值器)、FloatEvaluator(Float型属性估值器)、ArgbEvaluator(颜色属性股指器),估值器同样可以自定义,只需实现TypeEvaluator接口。注:插值器和估值器是实现非匀速动画的重要手段。
  • 属性动画监听
    • 属性动画提供两种类型的监听,分别是AnimatorListener和AnimatorUpdateListener,AnimatorListener被AnimatorListenerAdapter类适配,可以有选择的实现该接口中的方法。AnimatorUpdateListener用于监听动画中的每一帧动画。
  • 属性动画生效的前提条件:在此我们假设对对象A的width属性实施动画效果

    • A对象必须提供setWidth()方法,如果应用时未提供初始值,A还需提供getWidth()方法来获取width的初始值
    • A的setWidth()方法设置的值必须能够通过某种方式反应出来,比如UI的改变等
      以上两个条件必须同时满足,典型案例如Button的width,只满足第一个条件,想要详细了解请见Button的源码getWidth()、setWidth();
      当条件不满足的解决办法,官方提供如下三种:

      • 权限允许的情况下,为A加上get和set方法,基本上不被使用,A大多数来自SDK
      • 包装A类,为其提供get和set方法,用的比较多,示例如下
      • 使用ValueAnimator,监听动画过程
            private static 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();
                    }
                }
            //使用包装类
            ViewWrapper viewWrapper = new ViewWrapper(textView3);
            ObjectAnimator animator = ObjectAnimator.ofInt(viewWrapper,"width",50,500);
            animator.setDuration(5000);
            animator.start();

四、文章说明
本篇文章是自己对Android动画的学习总结,为了记忆,也为了后面使用方便,如有不对之处,欢迎阅览者提出,在此感谢任志刚老师的《Android开发艺术探索》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值