美文网首页
android 动画基础

android 动画基础

作者: 老北瓜 | 来源:发表于2020-02-08 15:28 被阅读0次

    分类 :
    帧动画 (图片动画)
    视图动画
    属性动画

    帧动画 :
    有多个图片组成
    方法 :
    · AnimationDrawable
    · <animation-list>

    文件中放入预先做好的动画帧,在drawable 文件夹右键 new xml文件,根标签为
    <animation-list>

    <animation-list xmlns:android="http://schemas.android.com/apk/res/android">
     
       <!--  将要显示效果的动画帧图片 和每一帧显示时间-->
        <item
            android:drawable="@drawable/ic_launcher_background"
            android:duration="100" />
        <item
            android:drawable="@drawable/ic_launcher_foreground"
            android:duration="100" />
        <item
            android:drawable="@drawable/ic_launcher_background"
            android:duration="100" />
    </animation-list>
    

    在view 的background :属性中引用生成的 animation-list 文件,在Activity中

         // view.getBackground() 获取到 用来控制帧动画的类
          animationDrawable = (AnimationDrawable) view.getBackground();
          animationDrawable.start();
          animationDrawable.stop();
    

    视图动画 :
    操作的是Android的视图 ,比如 button ,textview显示一些效果,展示补间动画,起点、终点和时间 。 视图动画并不改变视图的属性。

    Animation 是一个抽象类,用来操作视图动画
    

    res 目录下新建 anim 目录
    透明度:
    <alpha> 对应AlphaAnimation类
    anim 目录下新建 xml

    <set xmlns:android="http://schemas.android.com/apk/res/android"
      android:duration="1000"> 
          <alpha
          android:fromAlpha="1.0"
          android:toAlpha="0.1" />
    </set>
        在Activity 中 
          Animation  alphaAnimation =  AnimationUtils.loadAnimation(this, R.anim.alpha);
      view.startAnimation(alphaAnimation);   // start  不是 set ,
    

    缩放 :
    <scale> 对应 ScaleAnimation

    <set xmlns:android="http://schemas.android.com/apk/res/android"
     android:duration="1000"
     android:fillAfter="true">
     <!--    fillAfter = true  表示拉伸后保持状态不变  -->
     <!--    pivotX =  50   基准点 具体数值  距离左边50个像素的位置   -->
     <!--    pivotX = 50%  距离左边50%的位置  -->
     <!--    pivotX  = 50%p  距离父容器左边50% 的位置  -->
     <scale
         android:fromXScale="1.0"
         android:fromYScale="1.0"
         android:pivotX="50%"
         android:pivotY="50%"
         android:toXScale="2.0"
         android:toYScale="2.0" />
    
    </set>
    Activity 中
    Animation   scaleAnimation = AnimationUtils.loaddAnimation(this,R.anim.scale);
    view.startAnimation(scaleAnimation);
    

    位移动画: 视图的位置发生移动
    <translate> 对应 TranslateAnimation

     <!--   android:toXDelta="100%"  相对自身 位移一个宽度  -->
        <!--   android:toXDelta="20%p"  相对位移到使左边距 到 父布局的20%的位置  -->
        <!--   android:toXDelta="30"    向右位移30个像素  -->
    
        <translate
            android:fromXDelta="0"
            android:fromYDelta="0"
            android:toXDelta="100%"
            android:toYDelta="0" />
    

    旋转动画 :
    <rotate> 对应 RotateAnimation

    <set xmlns:android="http://schemas.android.com/apk/res/android">
        
        <!--    android:fromDegrees="0"    起始角度 -->
        <!--    android:pivotX="0"  基准点 -->
        <!--    android:pivotY="0"  -->
        <!--    android:toDegrees="90"  目标角度-->
        <!--     android:repeatCount="3" 重复次数-->
        <!--    Android:repeatMode="restart"|"reverse"  从头开始 | 原路返回-->
        <rotate
            android:duration="1000"
            android:fromDegrees="0"
            android:pivotX="0"
            android:pivotY="0"
            android:repeatCount="3"
            android:toDegrees="90" />
        
    </set>
    

    集合动画 :
    <set> 对应 AnimationSet 展示复合动画

    <set xmlns:android="http://schemas.android.com/apk/res/android">
    
    <!--  startOffset = "1000" 表示延迟1000ms 之后开始  -->
        <rotate android:toDegrees=""
            ...
            />
    
        <translate android:toYDelta=""
           android:startOffset = "1000"
            ...
        />
    </set>
    在Activity 中使用方法时一样的。
    

    差值器 : Interpolator

      Activity 中
      Animation a = AnimationUtils.loadAnimation(this,R.anim.translate);
      a.setInterpolator(new LinearInterpolator);  //线性变化率
       AccelerateInterpolator() ;    //  加速差值器
      view.setAnimation(a);
    

    属性动画
    操作任意对象,(视图动画只可以操作视图对象,改变不了属性),真实的修改视图属性
    动画属性 : 时长, 时间差值器,重复次数以及重复模式,动画集,延迟

    类 :
    Animator
    ValueAnimator
    AnimatorSet

    ValueAnimator的使用:

      /**
        *  动画 简单的说 就是   起点, 终点 和时间
        */
       ValueAnimator va = ValueAnimator.ofFloat(0f, 1.0f);
        va.setDuration(1000);
        va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                 float animatedFraction = animation.getAnimatedFraction();   // 完成度
                  float value = (float) animation.getAnimatedValue(); //  当前生成的差值
                  // 循环执行的,默认非线性的,如果需要线性执行,
                   va.setInterpolator(new LinearInterpolator());
                  }
              });
              va.start();
    

    AnimatorSet 的使用 :

    ObjectAnimator rotateAnimator = ObjectAnimator.ofFloat(view, "rotation", 0, 720f);
    rotateAnimator.setDuration(1000);
    
    ObjectAnimator translateAnimator = ObjectAnimator.ofFloat(view, "x", 0, 100f);
    translateAnimator.setDuration(1000);
    
    AnimatorSet set = new AnimatorSet();
    set.playSequentially(rotateAnimator, translateAnimator);        // 按照先后顺序执行
    // set.playTogether(rotateAnimator, translateAnimator);            // 同时进行
    
    set.start();
    

    上述效果的另外一种方法 :

     view.animate().rotation(720).setDuration(1000).start();
     //setStartDelay(1000)  延迟 1000ms 进行
     view.animate().translationX(500).setDuration(1000).setStartDelay(1000).start();
    

    ViewPropertyAnimator 让视图产生动画的类
    ViewPropertyAnimator va = view.animate();
    va.translationX(500);
    va.start();

    相关文章

      网友评论

          本文标题:android 动画基础

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