前言:
Android 动画有三种,帧动画,Tween(补间动画),以及属性动画
一 帧动画
Frame 逐帧动画,把动画的每一张图片收集起来进行显示。
在代码中AnimationDrawable 的方法开始和停止动画。
frame.xml
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/demo1" android:duration="200"/>
<item android:drawable="@drawable/demo2" android:duration="200"/>
</animation-list>
main.xml
<ImageView
android:id="@+id/img_v"
android:layout_width="match_parent"
android:layout_height="400dp"
android:background="@drawable/frame"/>
main 函数中
ImageView imgv = findViewById(R.id.img_v);
// 获取background
AnimationDrawable background =(AnimationDrawable) imgv.getBackground();
imgv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (flag){
background.start();
}else{
background.stop();
}
flag = !flag;
}
});
二 Tween
我们只需要给一个begin 和一个end, 只需要这两帧,系统会把中间的动画补全,这就是补间动画。
1 Alpha 动画
透明度动画
alpha.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha
android:fromAlpha = "0"
android:toAlpha = "1"
android:duration = "3000"
/>
</set>
ImageView imgv = findViewById(R.id.img_v);
// 获取backgroundAnimationDrawable background =(AnimationDrawable) imgv.getBackground();
imgv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 通过加载XML 动画设置文件创建一个动画
Animation animation = AnimationUtils.loadAnimation(MainActivity.this, R.anim.alpha);
// 开启动画
imgv.startAnimation(animation);
}
});
2 rotate 旋转动画
rotate 记得设置中心点
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 设置中心轴 :pivotX="50% 图片正中心-->
<rotate
android:fromDegrees="0"
android:toDegrees="360"
android:pivotX="50%"
android:duration="2000"
/>
</set>
Animation animation2 = AnimationUtils.loadAnimation(MainActivity.this,R.anim.rotate);
imgv.startAnimation(animation2);
[点击并拖拽以移动]
3 Scale 缩放动画
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale
android:fromXScale="0.5"
android:toXScale="1"
android:fromYScale="0.5"
android:toYScale="1"
android:pivotX="50%"
android:duration="2000"
/>
</set>
Animation animation3 = AnimationUtils.loadAnimation(MainActivity.this,R.anim.scale);
imgv.startAnimation(animation3);
4 translate 平移动画
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="0"
android:toXDelta="100"
android:fromYDelta="0"
android:toYDelta="200"
android:duration="2000"
/>
</set>
Animation animation4 = AnimationUtils.loadAnimation(MainActivity.this,R.anim.translate);
imgv.startAnimation(animation4);
三 属性动画
1 valueAnimator 使用
// 创建
ValueAnimator valueAnimator = ValueAnimator.ofFloat(0f, 2f);
// 3秒时间完成
valueAnimator.setDuration(3000);
// 监听
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(@NonNull ValueAnimator animator) {
float value = (float) animator.getAnimatedValue();
Log.e(TAG, "onAnimationUpdate: " + value);
}
});
// 开启
valueAnimator.start();
2 ObjectAnimator 的使用
这个直接可以对一个组件使用动画
// 透明度动画
ObjectAnimator animator1 = ObjectAnimator.ofFloat(imgv, "alpha", 0f, 1f);
// 旋转动画
ObjectAnimator animator2 = ObjectAnimator.ofFloat(imgv, "rotation", 0, 180);
// 平移动画
ObjectAnimator animator3 = ObjectAnimator.ofFloat(imgv, "translationX", 0, 100);
animator3.setDuration(4000);
animator3.start();
// 适配的方式监听动画回调完成
animator2.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
}
});
// 监听器,也可以采用适配的方式选择自己需要重写的方法
animator3.addListener(new Animator.AnimatorListener() {
// 开始的时候调用此方法
@Override
public void onAnimationStart(@NonNull Animator animator) {
}
// 动画结束的时候调用此方法
@Override
public void onAnimationEnd(@NonNull Animator animator) {
}
// 取消动画的时候调用此方法
@Override
public void onAnimationCancel(@NonNull Animator animator) {
}
// 重复执行的时候调用此方法
@Override
public void onAnimationRepeat(@NonNull Animator animator) {
}
});