欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Animation——View动画

程序员文章站 2022-03-17 11:18:44
...

什么是动画

动画有下面两种情况

  • 同一个图形通过视图在界面上进行透明度,缩放,旋转,平移的变化(View动画)
  • 在界面的同一个位置上不断切换显示不同的图片(Drawable动画)

动画的分类

  • View Animation
  • Drawable Animation

Android中提供了两种实现动画的方式

  • 纯编码的方式
  • xml配置的方式

动画在应用中是非常常见的界面效果, 也是提高用户体验的一种好手段

View动画的分类

单一动画(Animation)

  • 缩放动画(ScaleAnimation)
  • 透明度动画(AlphaAnimation)
  • 旋转动画(RotateAnimation)
  • 平移动画(TranslateAnimation)

复合动画(AnimationSet)

  • 由多个单一动画组合在一起的动画

Animation的公用功能

setDuration(long durationMillis) : 设置持续时间(单位ms)
setStartOffset(long startOffset) : 设置开始的延迟的时间(单位ms)
setFillBefore(boolean fillBefore) : 设置最终是否固定在起始状态
setFillAfter(boolean fillAfter) : 设置最终是否固定在最后的状态
setAnimationListener(AnimationListener listener) : 设置动画监听

坐标类型:

  • Animation.ABSOLUTE
  • Animation.RELATIVE_TO_SELF
  • Animation.RELATIVE_TO_PARENT

启动动画 : view.startAnimation(animation);
结束动画: view.clearAnimation()

动画监听器 : AnimationListener

  • onAnimationStart(Animation animation) : 动画开始的回调

  • onAnimationEnd(Animation animation) : 动画结束的回调

  • onAnimationRepeat(Animation animation) : 动画重复执行

缩放动画

第一种方式
Animation——View动画

  • fromX : 开始时X轴上的缩放比例
  • toX : 结束时X轴上的缩放比例
  • fromY :开始时Y轴上的缩放比例
  • toY :结束时Y轴上的缩放比例
  • pivotXType : X轴坐标的类型(计算x轴上的偏移量的方式)
  • pivotXVlaue : 中心点在X轴相对视图左顶点在x轴上的偏移量
  • pivotYType : Y轴坐标的类型(计算x轴上的偏移量的方式)
  • pivotYValue : 中心点相对视图左顶点在y轴上的偏移量

第二种方式

<scale xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="2000"
    android:fromXScale="0.0"
    android:fromYScale="0.0"
    android:pivotX=“1"
    android:pivotY=“0.5“           
    android:toXScale="1.0"
    android:toYScale="1.0"
    android:fillAfter="true"/>
  • Animation.ABSOLUTE : 数值(默认以px为单位) 100
  • Animation.RELATIVE_TO_SELF : 百分数,如:50% (以当前视图的宽度或高度其为基数来计算)
  • Animation.RELATIVE_TO_PARENT : 百分数+p,如:50%p (以父视图的宽度或高度其为基数来计算)
  • android:pivotX:0可以理解为左边,100可以理解为右边
  • android:pivotY:0可以理解为上边,100可以理解为下边

案例1:Code缩放动画: 宽度从0.5到1.5, 高度从0.0到1.0, 缩放的圆心为顶部中心点,延迟1s开始,持续2s,最终还原

        //1.创建动画对象
        ScaleAnimation animation = new ScaleAnimation(0.5f, 1.5f, 0, 1, Animation.ABSOLUTE,
                iv_animation.getWidth() / 2, Animation.ABSOLUTE, 0);
        //2.设置
        //设置延迟1s开始
        animation.setStartOffset(1000);
        //持续2秒
        animation.setDuration(2000);
        //最终还原
        animation.setFillBefore(true);
        //3.启动动画
        iv_animation.startAnimation(animation);

案列2:xml缩放动画: xml缩放动画: 宽度从0.0到1.5, 高度从0.0到1.0, 延迟1s开始,持续3s,圆心为右下角, 最终固定

  • 定义动画文件
<scale xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromXScale="0"
    android:fromYScale="0"
    android:pivotX="100%"
    android:pivotY="100%"
    android:toXScale="1.5"
    android:toYScale="1"
    android:duration="3000"
    android:fillAfter="true">

</scale>
  • 加载动画文件得到动画对象
 Animation animation = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.scale_test);
  • 启动动画
iv_animation.startAnimation(animation);

旋转动画

第一种方式
Animation——View动画

  • fromDegrees : 开始时的角度
  • toDegrees : 结束时的角度
  • pivotXType : X轴坐标的类型
  • pivotXVlaue : X轴坐标的值
  • pivotYType : Y轴坐标的类型
  • pivotYValue : Y轴坐标的值
    第二种方式
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="5000"
    android:fromDegrees="+90“
    android:toDegrees="-90"
    android:pivotX="0%"
    android:pivotY="0%"/>

案列1:Code旋转动画: 以图片中心点为中心, 从负90度到正90度, 持续5s

        //1.创建动画对象
        RotateAnimation animation = new RotateAnimation(-90, 90,
                Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
        //2.设置
        animation.setDuration(5000);
        //3.启动动画
        iv_animation.startAnimation(animation);

案列2:xml旋转动画: 以左顶点为坐标, 从正90度到负90度, 持续5s

  • 定义动画文件
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="5000"
    android:fromDegrees="-90"
    android:toDegrees="90">

</rotate>
  • 加载动画文件并获取对象
Animation animation = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.rotation_test);

设置动画

 iv_animation.setAnimation(animation);

透明度动画

第一种方式
Animation——View动画

  • fromAlpha : 开始时的缩放比例
  • toAlpha : 结束时的缩放比例

第二种方式

<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator"
android:fromAlpha="1.0"
android:toAlpha="0.0"
android:startOffset="500"
android:duration="1000" />

案列1:code透明度动画: 从完全透明到完全不透明, 持续2s

  tv_animation_msg.setText("code透明度动画: 从完全透明到完全不透明, 持续2s");
        //1.创建动画对象
        AlphaAnimation animation = new AlphaAnimation(0, 1);
        //2.设置
        animation.setDuration(2000);
        //3.启动动画
        iv_animation.startAnimation(animation);

案列2:xml透明度动画: 从完全不透明到完全透明, 持续4s

  • 定义动画文件
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="4000"
    android:fromAlpha="1"
    android:toAlpha="0">

</alpha>
  • 加载动画文件并获取对象
 Animation animation = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.alpha_test);
        animation.setFillAfter(true);
  • 启动动画
iv_animation.startAnimation(animation);

平移动画

第一种表达方式
Animation——View动画

  • romXType : 坐标类型
  • fromXValue : 开始时X轴的坐标
  • toXType :坐标类型
  • toXValue : 结束时X轴的坐标
  • fromYType :坐标类型
  • fromYValue : 开始时Y轴的坐标
  • toYType :坐标类型
  • toYValue : 结束时Y轴的坐标

第二种表达方式

<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="2000"
    android:fromXDelta="-100%p"
    android:fromYDelta="0%"
    android:toXDelta="0%"
    android:toYDelta="0%" />

案列1:Code移动动画: 向右移动一个自己的宽度, 向下移动一个自己的高度, 持续2s

       //1.创建动画对象
       TranslateAnimation animation = new TranslateAnimation(Animation.ABSOLUTE, 0,              Animation.RELATIVE_TO_SELF, 1
                , Animation.ABSOLUTE, 0, Animation.RELATIVE_TO_SELF, 1);
        ///设置
        animation.setDuration(2000);
        //启动动画
        iv_animation.startAnimation(animation);

案列2:xml移动动画: 从屏幕的右边逐渐回到原来的位置, 持续2s

  • 定义动画文件
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromXDelta="100%p"
    android:toXDelta="0"
    android:fromYDelta="0"
    android:toYDelta="0"
    android:duration="2000">

</translate>
  • 加载动画文件得到动画对象
 Animation animation = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.translate_test);
  • 启动动画
   iv_animation.startAnimation(animation);

复合动画

第一种表达方式

// 复合动画对象
AnimationSet animationSet = new AnimationSet(false);

// 添加一个单一动画
animationSet.addAnimation(alpha);
animationSet.addAnimation(rotate);

//开启动画
iv_animation.startAnimation(animationSet);

第二种表达方式

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <alpha
        android:duration="2000"
        android:fromAlpha="0.0"
        android:toAlpha="1.0" />
    <rotate
        android:duration="1000"
        android:fromDegrees="0"
        android:pivotX="50%"
        android:pivotY="50%“
        android:toDegrees="360" />
</set>

案列1:Code复合动画: 透明度从透明到不透明, 持续2s, 接着进行旋转360度的动画, 持续1s

        //1.创建透明度动画
        AlphaAnimation animation = new AlphaAnimation(0, 1);
        animation.setDuration(2000);
        //2.创建旋转动画
        RotateAnimation animation1 = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
        animation1.setStartOffset(2000);
        animation1.setDuration(1000);
        //3.创建复合动画对象
        AnimationSet animationSet=new AnimationSet(true);
        //4.添加两个动画
        animationSet.addAnimation(animation);
        animationSet.addAnimation(animation1);
        //5.启动复合动画对象
        iv_animation.startAnimation(animationSet);

案列2:xml复合动画: 透明度从透明到不透明, 持续2s, 接着进行旋转360度的动画, 持续2s

  • 定义动画文件
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <alpha
        android:duration="2000"
        android:fromAlpha="0"
        android:toAlpha="1" />
    <rotate
        android:pivotX="50%"
        android:pivotY="50%"
        android:fromDegrees="0"
        android:toDegrees="360"
        android:startOffset="2000"
        android:duration="2000"/>
</set>
  • 加载动画文件得到动画对象
 Animation animation = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.set_test);
  • 启动动画
 iv_animation.startAnimation(animation);

设置动画监听事件

在程序中可以对动画的特定时刻进行监听

  • Animation.setAnimationListener(AnimationListener listener) : 设置动画监听

动画监听器 : AnimationListener

  • onAnimationStart(Animation animation) : 动画开始的回调

  • onAnimationEnd(Animation animation) : 动画结束的回调

  • onAnimationRepeat(Animation animation) : 动画重复执行

Interpolator属性的使用

Interpolator 被用来修饰动画效果,定义动画的变化率,可以使存在的动画效果accelerated(加速),decelerated(减速),repeated(重复)等。

  • @android:anim/linear_interpolator : 线性变化
  • @android:anim/accelerate_interpolator : 加速变化
  • @android:anim/decelerate_interpolator : 减速变化
  • @android:anim/cycle_interpolator : 周期循环变化

案列:动画监听和Interpolator属性的结合使用

        //1. 定义动画文件
        //2. 加载动画文件得到动画对象
        Animation animation = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
        animation.setDuration(1000);
        //设置线性变化
        animation.setInterpolator(new LinearInterpolator());
        //设置动画重复次数
        animation.setRepeatCount(Animation.INFINITE);//重复3次
        //设置动画监听
        animation.setAnimationListener(new Animation.AnimationListener() {

            @Override
            public void onAnimationStart(Animation animation) {
                Log.e("TAG", "动画开始");
            }

            @Override
            public void onAnimationRepeat(Animation animation) {
                Log.e("TAG", "动画重复");

            }

            @Override
            public void onAnimationEnd(Animation animation) {
                Log.e("TAG", "动画结束");
            }
        });

        //3. 启动动画
        iv_animation.startAnimation(animation);

图片动画的使用

配置

<animation-list 
xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<item android:drawable="@drawable/nv1" android:duration="500" />
<item android:drawable="@drawable/nv2" android:duration="500" />
<item android:drawable="@drawable/nv3" android:duration="500" />
<item android:drawable="@drawable/nv4" android:duration="500" />
</animation-list>

使用

<ImageView
    android:id="@+id/iv_dv"
    android:layout_width=“80dp"
    android:layout_height=“80dp"
    android:layout_marginTop="160dp"
    android:background="@drawable/anim_da" />