Android动画
2020-09-18 本文已影响0人
Anwfly
Android 动画分类
- 帧动画(Frame Animation)
- 补间动画(Tweened Animation)
- 属性动画(Property Animation)
一、帧动画
原理:将一张张单独的图片连贯的进行播放,从而在视觉上产生一种动画的效果,类似电影播放
实现
- 在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>
- 在界面中
@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 实现
- 在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"/>
- 在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. 具体使用
对于属性动画的使用,主要是:
- 两个使用方法类:
ValueAnimator
和ObjectAnimator
- 两个辅助类:插值器和估值器
5.1 ValueAnimator
- 定义:属性动画机制中最核心一个类
- 原理:通过不间断控制值的变化,再不断手动赋值给对象的属性,从而实现动画效果
- 三个方法:
ValueAnimator.ofInt(int values)
ValueAnimator.ofFloat(float values)
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();
⑤自定义