美文网首页
Android动画

Android动画

作者: Anwfly | 来源:发表于2020-09-18 16:39 被阅读0次

    Android 动画分类

    1. 帧动画(Frame Animation)
    2. 补间动画(Tweened Animation)
    3. 属性动画(Property Animation)

    一、帧动画

    原理:将一张张单独的图片连贯的进行播放,从而在视觉上产生一种动画的效果,类似电影播放
    实现

    1. 在drawable中创建anim_list
    <?xml version="1.0" encoding="utf-8"?>
    <animation-list xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:drawable="@drawable/a" android:duration="500" />
        <item android:drawable="@drawable/b" android:duration="500" />
        <item android:drawable="@drawable/c" android:duration="500" />
        <item android:drawable="@drawable/d" android:duration="500" />
        <item android:drawable="@drawable/e" android:duration="500" />
        <item android:drawable="@drawable/f" android:duration="500" />
    </animation-list>
    
    1. 在界面中
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        iv.setImageResource(R.drawable.anim_list);
        AnimationDrawable drawable = (AnimationDrawable) iv.getDrawable();
        drawable.setOneShot(true);
        drawable.start();
    }
    

    二、补间动画

    补间动画分为四种形式:alpha(淡入淡出),translate(位移),scale(缩放大小),rotate(旋转)。
    补间动画的实现,一般会采用xml 文件的形式;代码会更容易书写和阅读,同时也更容易复用。

    XML 实现

    1. 在res/anim/ 文件夹下定义如下的动画实现方式

    alpha_anim.xml 动画实现

    <?xml version="1.0" encoding="utf-8"?>
    <alpha xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="1000"
        android:fromAlpha="1.0"
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        android:toAlpha="0.0" />
    

    scale.xml 动画实现

    <?xml version="1.0" encoding="utf-8"?>
    <scale xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="1000"
        android:fromXScale="0.0"
        android:fromYScale="0.0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toXScale="1.0"
        android:toYScale="1.0"/>
    
    1. 在Activity中
    Animation animation = AnimationUtils.loadAnimation(mContext, R.anim.alpha_anim);
    iv.startAnimation(animation);
    

    这样就可以实现ImageView alpha 透明变化的动画效果。
    也可以使用set 标签将多个动画组合(代码源自Android SDK API)

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:interpolator="@[package:]anim/interpolator_resource"
        android:shareInterpolator=["true" | "false"] >
        <alpha
            android:fromAlpha="float"
            android:toAlpha="float" />
        <scale
            android:fromXScale="float"
            android:toXScale="float"
            android:fromYScale="float"
            android:toYScale="float"
            android:pivotX="float"
            android:pivotY="float" />
        <translate
            android:fromXDelta="float"
            android:toXDelta="float"
            android:fromYDelta="float"
            android:toYDelta="float" />
        <rotate
            android:fromDegrees="float"
            android:toDegrees="float"
            android:pivotX="float"
            android:pivotY="float" />
        <set>
            ...
        </set>
    </set>
    

    可以看到组合动画是可以嵌套使用的。

    Java代码

    有时候,动画的属性值可能需要动态的调整,这个时候使用xml 就不合适了,需要使用java代码实现
    alpha

    AlphaAnimation animation = new AlphaAnimation(1.0f, 0.0f);
    animation.setDuration(2000);
    animation.setRepeatCount(2);
    animation.setRepeatMode(Animation.REVERSE);
    iv.startAnimation(animation);
    

    traslate

    TranslateAnimation translateAnimation = new TranslateAnimation(0, 200, 0, 500);
    translateAnimation.setDuration(3000);
    translateAnimation.setRepeatCount(2);
    translateAnimation.setRepeatMode(Animation.RESTART);
    iv.startAnimation(translateAnimation);
    

    set

    
    

    Activity切换动画

    startActivity()方法之后调用overridePendingTransition方法。

    startActivity(intent);
    overridePendingTransition(R.anim.fade_in, R.anim.fade_out);
    

    重写Activity的finish方法, 并调用overridePendingTransition方法。

    @Override
    public void finish() {
        super.finish();
        overridePendingTransition(R.anim.fade_in, R.anim.fade_out);
    }
    

    三、属性动画

    1. 为什么引入属性动画

    原因:帧动画和补间动画存在问题:

    • 作用对象局限:view
    • 没有改变view的属性,只是改变视觉效果
    • 动画效果单一,只能star

    2. 简介

    • 作用对象:任意java对象(不再局限在view)
    • 实现动画效果:可以自定义各种动画效果

    3.特点

    • 作用对象进行了扩展:不只作用于view对象,可以作用在任意java对象上,甚至没有对象也可以
    • 动画效果:不只是四种了
    • 作用领域:Android3.0(API11)后引入

    4. 原理

    在一定时间间隔内,通过不断对值进行改变,并不断将该值赋给对象的属性,从而实现该对象在该属性上的动画效果

    5. 具体使用

    对于属性动画的使用,主要是:

    1. 两个使用方法类:ValueAnimatorObjectAnimator
    2. 两个辅助类:插值器和估值器

    5.1 ValueAnimator

    • 定义:属性动画机制中最核心一个类
    • 原理:通过不间断控制值的变化,再不断手动赋值给对象的属性,从而实现动画效果
    • 三个方法:
    1. ValueAnimator.ofInt(int values)
    2. ValueAnimator.ofFloat(float values)
    3. ValueAnimator.ofObject(int values)
    • 使用
    Button mButton = (Button) findViewById(R.id.Button);
    // 创建动画作用对象:此处以Button为例
    
    // 步骤1:设置属性数值的初始值 & 结束值
    ValueAnimator valueAnimator = ValueAnimator.ofInt(mButton.getLayoutParams().width, 500);
    // 初始值 = 当前按钮的宽度,此处在xml文件中设置为150
    // 结束值 = 500
    // ValueAnimator.ofInt()内置了整型估值器,直接采用默认的.不需要设置
    // 即默认设置了如何从初始值150 过渡到 结束值500
    
    // 步骤2:设置动画的播放各种属性
    valueAnimator.setDuration(2000);
    // 设置动画运行时长:1s
    
    // 步骤3:将属性数值手动赋值给对象的属性:此处是将 值 赋给 按钮的宽度
    // 设置更新监听器:即数值每次变化更新都会调用该方法
    valueAnimator.addUpdateListener(new AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animator) {
    
            int currentValue = (Integer) animator.getAnimatedValue();
            // 获得每次变化后的属性值
            System.out.println(currentValue);
            // 输出每次变化后的属性值进行查看
    
            mButton.getLayoutParams().width = currentValue;
            // 每次值变化时,将值手动赋值给对象的属性
            // 即将每次变化后的值 赋 给按钮的宽度,这样就实现了按钮宽度属性的动态变化
    
    // 步骤4:刷新视图,即重新绘制,从而实现动画效果
            mButton.requestLayout();
    
        }
    });
    
    valueAnimator.start();
    // 启动动画
    

    5.2 ObjectAnimator

    • 简介
      实现属性动画中的一个核心方法类
      继承自ValueAnimator类,即底层的动画实现机制是基于ValueAnimator类
    • 原理
      直接对对象的属性值进行改变操作,从而实现动画效果
    • 使用
      ①透明度
    mButton = (Button) findViewById(R.id.Button);
    // 创建动画作用对象:此处以Button为例
    
    ObjectAnimator animator = ObjectAnimator.ofFloat(mButton, "alpha", 1f, 0f, 1f);
    // 表示的是:
    // 动画作用对象是mButton
    // 动画作用的对象的属性是透明度alpha
    // 动画效果是:常规 - 全透明 - 常规
    animator.setDuration(5000);
    animator.start();
    

    ②旋转

    mButton = (Button) findViewById(R.id.Button);
    // 创建动画作用对象:此处以Button为例
    
    ObjectAnimator animator = ObjectAnimator.ofFloat(mButton, "rotation", 0f, 360f);
    
    // 表示的是:
    // 动画作用对象是mButton
    // 动画作用的对象的属性是旋转alpha
    // 动画效果是:0 - 360
    animator.setDuration(5000);
    animator.start();
    

    ③平移

    mButton = (Button) findViewById(R.id.Button);
    // 创建动画作用对象:此处以Button为例
    
    float curTranslationX = mButton.getTranslationX();
    // 获得当前按钮的位置
    ObjectAnimator animator = ObjectAnimator.ofFloat(mButton, "translationX", curTranslationX, 300,curTranslationX);
    // 表示的是:
    // 动画作用对象是mButton
    // 动画作用的对象的属性是X轴平移(在Y轴上平移同理,采用属性"translationY"
    // 动画效果是:从当前位置平移到 x=1500 再平移到初始位置
    animator.setDuration(5000);
    animator.start();
    

    ④缩放

    mButton = (Button) findViewById(R.id.Button);
    // 创建动画作用对象:此处以Button为例
    
    ObjectAnimator animator = ObjectAnimator.ofFloat(mButton, "scaleX", 1f, 3f, 1f);
    // 表示的是:
    // 动画作用对象是mButton
    // 动画作用的对象的属性是X轴缩放
    // 动画效果是:放大到3倍,再缩小到初始大小
    animator.setDuration(5000);
    animator.start();
    

    ⑤自定义

    相关文章

      网友评论

          本文标题:Android动画

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