Android动画

2020-09-18  本文已影响0人  Anwfly

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. 为什么引入属性动画

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

2. 简介

3.特点

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

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();

⑤自定义

上一篇下一篇

猜你喜欢

热点阅读