android 动画基础

2020-02-08  本文已影响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();

上一篇下一篇

猜你喜欢

热点阅读