Android 动画相关
前言:
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
<ImageViewandroid: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);// 获取backgroundAnimationDrawable background =(AnimationDrawable) imgv.getBackground();imgv.setOnClickListener(new View.OnClickListener() {@Overridepublic 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"><alphaandroid: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() {@Overridepublic 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% 图片正中心--><rotateandroid: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"><scaleandroid: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"><translateandroid: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() {@Overridepublic 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() {@Overridepublic void onAnimationEnd(Animator animation) {super.onAnimationEnd(animation);}});// 监听器,也可以采用适配的方式选择自己需要重写的方法animator3.addListener(new Animator.AnimatorListener() {// 开始的时候调用此方法@Overridepublic void onAnimationStart(@NonNull Animator animator) {}// 动画结束的时候调用此方法@Overridepublic void onAnimationEnd(@NonNull Animator animator) {}// 取消动画的时候调用此方法@Overridepublic void onAnimationCancel(@NonNull Animator animator) {}// 重复执行的时候调用此方法@Overridepublic void onAnimationRepeat(@NonNull Animator animator) {}});