Android动画初探

安卓动画目前共分为三种动画逐帧动画、补间动画和属性动画。

一、逐帧动画(frame-by-frame animation)

逐帧动画就是将一个完整的动画拆分成一张张单独的图片,然后再将它们连贯起来进行播放,类似于动画片的工作原理。

  • 素材图片放到drawable文件夹下,mipmap下无法引用
素材图片
  • 在drawable文件夹下新建wifi-z的xml文件用来存放图片

    android:oneshot="false">
    //oneshot表示是否循环播放 true只播放一次,false循环播放,图片顺序不能变否则动画不连贯
    android:drawable="@drawable/icon_5"
    android:duration="300" />
    android:drawable="@drawable/icon_4"
    android:duration="300" />
    android:drawable="@drawable/icon_3"
    android:duration="300" />
    android:drawable="@drawable/icon_2"
    android:duration="300" />
    android:drawable="@drawable/icon_1"
    android:duration="300" />
    android:drawable="@drawable/icon_0"
    android:duration="300" />

  • Activity中引用动画
    // 存放动画图片的imageview
    private ImageView mImg;
    // 开启动画的按钮
    private Button mBtn;
    // 实现逐帧动画的类
    private AnimationDrawable animationDrawable;

        mBtn.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
              mImg.setImageResource(R.drawable.wifi_d);
              animationDrawable = (AnimationDrawable) mImg.getDrawable();
              animationDrawable.start();//停止调用stop方法
          }
      });
    

二、补间动画(tweened animation)

补间动画则是可以对View进行一系列的动画操作,包括淡入淡出、缩放、平移、旋转四种。

补间动画只是表面上的View移动,View实际还在原来位置,而属性动画则是View也跟着移动

  • 淡入淡出
    AlphaAnimation:透明度(alpha)渐变效果,对应标签。
    外部xml方法
    android:duration="2000"
    android:fromAlpha="1.0"
    android:fillAfter="false"//动画结束时是否保持在该位置
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"//插值器
    android:toAlpha="0.1" />

      Animation animation = AnimationUtils.loadAnimation(this, R.anim.alpha);
      mImg.startAnimation(animation);
    

    java方式
    Animation alphaAnimation = new AlphaAnimation(1.0f, 0.1f);
    alphaAnimation.setDuration(2000);
    alphaAnimation.setFillAfter(false);
    mImg.startAnimation(alphaAnimation);

  • 缩放
    ScaleAnimation:缩放渐变,可以指定缩放的参考点,对应标签。
    xml方式
    android:duration="2000"
    android:fromXScale="0.2"
    android:fromYScale="0.2"
    android:interpolator="@android:anim/accelerate_interpolator"
    android:pivotX="50%"
    android:pivotY="50%" //动画起始位置,相对于屏幕的百分比,两个都为50%表示动画从自身中间开始
    android:toXScale="1.5"
    android:toYScale="1.5" />
    java方式
    Animation scaleAnimation = new ScaleAnimation(0.0f, 1.5f, 0.0f, 1.5f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
    scaleAnimation.setDuration(2000);//设置动画持续时间为500毫
    scaleAnimation.setInterpolator(this, android.R.anim.accelerate_interpolator);//设置动画插入器
    mImg.startAnimation(scaleAnimation);

  • 平移
    TranslateAnimation:位移渐变,需要指定移动点的开始和结束坐标,对应标签。
    xml方式
    android:duration="2000"
    android:fromXDelta="0"
    android:fromYDelta="0"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"
    android:toXDelta="320"
    android:toYDelta="0" />
    java方式
    Animation translateAnimation = new TranslateAnimation(0, 320, 0, 0);
    translateAnimation.setDuration(2000);
    translateAnimation.setInterpolator(this, android.R.accelerate_decelerate_interpolator);//设置动画插入器
    mImg.startAnimation(translateAnimation);

  • 旋转
    RotateAnimation:旋转渐变,可以指定旋转的参考点,对应标签。
    xml方式
    android:duration="1000"
    android:fromDegrees="0"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"
    android:repeatCount="-1"//-1代表无限循环 正数代表循环几次
    android:repeatMode="reverse"//动画重复的模式,reverse为反向,当第偶次执行时,动画方向会相反。restart为重新执行,方向不变
    android:toDegrees="360" />
    java方式
    Animation rotateAnimation = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
    rotateAnimation.setDuration(1000);
    rotateAnimation.setInterpolator(this, android.R.anim.accelerate_decelerate_interpolator);//设置动画插入器
    mImg.startAnimation(rotateAnimation);

  • 组合
    AnimationSet:组合渐变,支持组合多种渐变效果,对应标签。
    java方式
    AnimationSet animationSet = new AnimationSet(true);
    animationSet.addAnimation(alphaAnimation);
    animationSet.addAnimation(scaleAnimation);
    mImg.startAnimation(animationSet);

  • 动画监听器
    alphaAnimation.setAnimationListener(new Animation.AnimationListener() {
    @Override
    public void onAnimationStart(Animation animation) {
    //动画开始时调用 }
    @Override
    public void onAnimationEnd(Animation animation) {
    //动画结束时调用 }
    @Override
    public void onAnimationRepeat(Animation animation) {
    //动画重复时调用 } });

  • 插值器
    AccelerateInterpolator 加速,开始时慢中间加速
    DecelerateInterpolator 减速,开始时快然后减速
    AccelerateDecelerateInterolator 先加速后减速,开始结束时慢,中间加速
    AnticipateInterpolator 反向,先向相反方向改变一段再加速播放
    AnticipateOvershootInterpolator 反向加超越,先向相反方向改变,再加速播放,会超出目的值然后缓慢移动至目的值
    BounceInterpolator 跳跃,快到目的值时值会跳跃,如目的值100,后面的值可能依次为85,77,70,80,90,100
    CycleIinterpolator 循环,动画循环一定次数,值的改变为一正弦函数:Math.sin(2* mCycles* Math.PI* input)
    LinearInterpolator 线性,线性均匀改变
    OvershootInterpolator超越,最后超出目的值然后缓慢改变到目的值

三、属性动画(property animation)

功能很强大,可以替代逐帧动画与补间动画。

  • ValueAnimator
    属性动画的运行机制是通过不断地对值进行操作来实现的,而初始值和结束值之间的动画过渡就是由ValueAnimator这个类来负责计算的。它的内部使用一种时间循环的机制来计算值与值之间的动画过渡,我们只需要将初始值和结束值提供给ValueAnimator,并且告诉它动画所需运行的时长,那么ValueAnimator就会自动帮我们完成从初始值平滑地过渡到结束值这样的效果。

      //从0-1-5-1 float 类型 整型可以ofInt
      ValueAnimator animator = ValueAnimator.ofFloat(0f, 1.0f, 5.0f, 1.0f);
      animator.setDuration(300);
      animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
          @Override
          public void onAnimationUpdate(ValueAnimator valueAnimator) {
              float value = (float) valueAnimator.getAnimatedValue();
              Log.d(TAG, "onAnimationUpdate: " + value);
          }
      });
      animator.start();
    
Android动画初探_第1张图片
  • ObjectAnimator
    可以直接对任意对象的任意属性进行动画操作的,比如说View的alpha属性。
    // 旋转:rotation 渐变:alpha 平移:x轴tarnslationX(平移时需要先获取当前位置,getTranslationX)
    //缩放 scaleX/scaleY
    ObjectAnimator animator = ObjectAnimator.ofFloat(mProperty, "alpha", 1.f, 0f);
    animator.setDuration(1000);
    animator.start();

  • AnimatorSet(组合动画)

  • after(Animator anim) 将现有动画插入到传入的动画之后执行

  • after(long delay) 将现有动画延迟指定毫秒后执行

  • before(Animator anim) 将现有动画插入到传入的动画之前执行

  • with(Animator anim) 将现有动画和传入的动画同时执行
    ObjectAnimator translate = ObjectAnimator.ofFloat(mProperty, "translationX", -500f, 0f);
    ObjectAnimator rotation = ObjectAnimator.ofFloat(mProperty, "rotation", 0f, 360f);
    ObjectAnimator scale = ObjectAnimator.ofFloat(mProperty, "scaleX", 1.0f, 2.0f, 1.0f);
    AnimatorSet set = new AnimatorSet();
    set.play(rotation).with(scale).after(translate);
    set.setDuration(5000);
    set.start();

  • Animator监听器

  • 监听所有方法
    translate.addListener(new Animator.AnimatorListener() {
    @Override
    public void onAnimationStart(Animator animator) {

         }
    
         @Override
         public void onAnimationEnd(Animator animator) {
    
         }
    
         @Override
         public void onAnimationCancel(Animator animator) {
    
         }
    
         @Override
         public void onAnimationRepeat(Animator animator) {
    
         }
     });
    
  • 监听单个方法
    rotation.addListener(new AnimatorListenerAdapter() {
    @Override
    public void onAnimationEnd(Animator animation) {
    super.onAnimationEnd(animation);
    }
    });

你可能感兴趣的:(Android动画初探)