美文网首页
Android动画初探

Android动画初探

作者: V1tas | 来源:发表于2017-03-21 11:45 被阅读0次

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

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

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

    • 素材图片放到drawable文件夹下,mipmap下无法引用
    素材图片
    • 在drawable文件夹下新建wifi-z的xml文件用来存放图片
      <?xml version="1.0" encoding="utf-8"?>
      <animation-list xmlns:android="http://schemas.android.com/apk/res/android"
      android:oneshot="false">
      //oneshot表示是否循环播放 true只播放一次,false循环播放,图片顺序不能变否则动画不连贯
      <item
      android:drawable="@drawable/icon_5"
      android:duration="300" />
      <item
      android:drawable="@drawable/icon_4"
      android:duration="300" />
      <item
      android:drawable="@drawable/icon_3"
      android:duration="300" />
      <item
      android:drawable="@drawable/icon_2"
      android:duration="300" />
      <item
      android:drawable="@drawable/icon_1"
      android:duration="300" />
      <item
      android:drawable="@drawable/icon_0"
      android:duration="300" />
      </animation-list>

    • 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进行一系列的动画操作,包括淡入淡出、缩放、平移、旋转四种。
    <b>
    补间动画只是表面上的View移动,View实际还在原来位置,而属性动画则是View也跟着移动</b>

    • 淡入淡出
      AlphaAnimation:透明度(alpha)渐变效果,对应<alpha/>标签。
      外部xml方法
      <alpha xmlns:android="http://schemas.android.com/apk/res/android"
      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:缩放渐变,可以指定缩放的参考点,对应<scale/>标签。
      xml方式
      <scale xmlns:android="http://schemas.android.com/apk/res/android"
      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:位移渐变,需要指定移动点的开始和结束坐标,对应<translate/>标签。
      xml方式
      <translate xmlns:android="http://schemas.android.com/apk/res/android"
      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:旋转渐变,可以指定旋转的参考点,对应<rotate/>标签。
      xml方式
      <rotate xmlns:android="http://schemas.android.com/apk/res/android"
      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:组合渐变,支持组合多种渐变效果,对应<set/>标签。
      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();
      
    • 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动画初探

          本文链接:https://www.haomeiwen.com/subject/jvpwnttx.html