Android进阶之光笔记四:动画
一、补间动画(Tween Animation)
1、概念
Tween Animation就是一系列View形状的变换,如大小的缩放、透明度的改变、水平位置的改变、旋转位置改变,动画的定义既可以用java代码定义也可以用XML定义。
2、用xml资源实现补间动画
1)在res/anim/目录下创建动画资源文件,在其中定义需要的动画
XML文件的根元素为<set> , 二级节点可为<alpha>,<scale>,<translate>,<rotate>
2)在代码中加载动画资源
Animation animation = AnimationUtils.loadAnimation(this, R.anim.***);
3)开启动画
***.startAnimation(animation);
3、透明度动画(AlphaAnimation)
1)用xml资源
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha android:fromAlpha="1"
android:toAlpha="0"
android:fillAfter="true"
android:repeatMode="reverse"
android:repeatCount="1"
android:duration="2000"
android:interpolator="@android:anim/linear_interpolator"/>
</set>
属性 | 描述 |
---|---|
android:repeatMode | 用于设置动画的重复方式,可为reverse(反向)或restart(重新开始) |
android:repeatCount | 用于设置动画的重复次数,可以是infinite(无限循环) |
android:duration | 用于指定持续的时间,单位为毫秒 |
android:fromAlpha | 用于指定动画开始时的透明度。值为0.0代表完全透明,值为1.0代表完全不透明 |
android:toAlpha | 用于指定动画结束时的透明度。值为0.0代表完全透明,值为1.0代表完全不透明 |
android:interpolotor | 于控制动画的变化速度,使用动画效果可以匀速、加速、减速或抛物线速度等各种速度变化 |
android:interpolotor的常用属性值
属性 | 描述 |
---|---|
@android:anim/linear_interpolator | 动画一直在做匀速改变 |
@android:anim/accelerate_interpolator | 在动画开始的地方改变速度较慢,然后开始加速 |
@android:anim/decelerate_interpolator | 在动画开始的地方改变速度较快,然后开始减速 |
@android:anim/accelerate_decelerate_interpolator | 动画在开始和结束的地方改变速度较慢,在中间的时候加速 |
@android:anim/cycle_interpolator | 动画循环播放特定的次数,速率改变沿着正弦曲线 |
@android:anim/bounce_interpolator | 动画结束的地方采用弹球效果 |
@android:anim/anticipate_interpolator | 在动画开始的地方先向后退一小步,再快速到达动画结束的地方 |
@android:anim/overshoot_interpolator | 动画快速到达终点,并超出一小步最后回到动画结束的地方 |
@android:anim/anticipate_overshoot_interpolator | 在动画开始的地方先向后退一小步,再开始动画,到结束的地方再超出一小步,最后回到动画结束的地方 |
2)用java代码实现
//romAlpha:开始透明度。取值范围(全透明0.0f~不透明1.0f)
//toAlpha:结束透明度。 取值范围(全透明0.0f~不透明1.0f)
AlphaAnimation(float fromAlpha, float toAlpha)
4、缩放动画(ScaleAnimation)
1)用xml资源
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale android:fromXScale="1"
android:interpolator="@android:anim/decelerate_interpolator"
android:fromYScale="1"
android:toXScale="2.0"
android:toYScale="2.0"
android:pivotX="50%"
android:pivotY="50%"
android:fillAfter="true"
android:repeatCount="1"
android:repeatMode="reverse"
android:duration="2000"/>
</set>
属性 | 描述 |
---|---|
android:fromXScale | 用于指定动画开始时水平方向上的缩放系数,值为1.0表示不变化 |
android:toXScale | 用于指定动画结束时水平方向上的缩放系数,值为1.0表示不变化 |
android:fromYScale | 用于指定动画开始时垂直方向上的缩放系数,值为1.0表示不变化 |
android:toYScale | 用于指定动画结束时垂直方向上的缩放系数,值为1.0表示不变化 |
android:pivotX | 用于指定轴心点X轴坐标,50%代表相对父容器的位置 |
android:pivotY | 用于指定轴心点Y轴坐标 |
2)用java代码实现
// fromX:开始缩放的X轴倍数。如1.0f:本身大小;如2.0f:从自己两倍开始
// toX:结束缩放的X轴倍数。
// fromY:开始缩放的Y轴倍数。
// toY:结束缩放的Y轴倍数。
// pivotXType:X轴缩放中心点类型;可选值有:
Animation.RELATIVE_TO_SELF相对自己--常用
Animation.RELATIVE_TO_PARENT相对父窗体
Animation.ABSOLUTE 绝对的---不常用
// pivotXValue:在pivotXType的基础上,X轴缩放中心的位置。如:0.5f:缩放中心就在控件的一半的位置。如果是0.0f,则会在控件本身的左边位置
// pivotYType:X轴缩放中心点类型;同上 ...
// pivotYValue:在pivotYType的基础上,Y轴缩放中心的位置。
ScaleAnimation(float fromX, float toX, float fromY, float toY, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)
5、旋转动画(RotateAnimation)
1)用xml资源
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<rotate
android:interpolator="@android:anim/accelerate_interpolator"
android:fromDegrees="0"
android:toDegrees="720"
android:pivotX="50%"
android:pivotY="50%"
android:duration="2000">
</rotate>
</set>
属性 | 描述 |
---|---|
android:fromDegrees | 用于指定动画开始时旋转的角度 |
android:toDegrees | 用于指定动画结束时旋转的角度 |
2)用java代码实现
//fromDegrees:开始旋转的角度;三点方向为0度,六点方向为90度。
//toDegrees:结束旋转的角度
//pivotXType:参照缩放动画
//pivotXValue:参照缩放动画
//pivotYType:参照缩放动画
//pivotYValue:参照缩放动画
RotateAnimation(float fromDegrees, float toDegrees, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)
6、平移动画(TranslateAnimation)
1)用xml资源
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="0"
android:toXDelta="320"
android:fromYDelta="0"
android:toYDelta="0"
android:fillAfter="true"
android:repeatMode="reverse"
android:repeatCount="1"
android:duration="2000">
</translate>
</set>
属性 | 描述 |
---|---|
android:fromXDelta | 用于指定动画开始时水平方向上的起始位置 |
android:toXDelta | 用于指定动画结束时水平方向上的起始位置 |
android:fromYDelta | 用于指定动画开始时垂直方向上的起始位置 |
android:toYDelta | 用于指定动画结束时垂直方向上的起始位置 |
2)用java代码实现
//fromXType:开始平移的X轴参照位置,一般使用Animation.RELATIVE_TO_SELF
//fromXValue:X轴平移的开始倍数。在fromXType的基础上。
//toXType:结束平移的X轴参照位置
//toXValue:X轴平移的结束倍数。
//fromYType:开始平移的Y轴参照位置
//fromYValue:Y轴平移的开始倍数。
//toYType:结束平移的Y轴参照位置
//toYValue:Y轴平移的结束倍数。
TranslateAnimation(int fromXType, float fromXValue, int toXType, float toXValue, int fromYType, float fromYValue, int toYType, float toYValue)
二、帧动画(Frame Animation)
1、概念
就像GIF图片,通过一系列Drawable依次显示来模拟动画的效果。
2、实现
1)新建一个drawable资源 以animation-list 为根节点创建资源文件
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false"><!--oneshot:是否只执行一次-->
<item
android:drawable="@drawable/ic_launcher_foreground"
android:duration="200" />
</animation-list>
2)给ImageView或者其他View设置关联drawable。可以作为background或src。
//把Drawable设置为ImageView的背景
iv.setBackgroundResource(R.drawable.anim_frame);
3)在java代码中,通过View.getBackground()或者ImageView.getDrawable(),得到已经关联View的Drawable对象,转成AnimationDrawable对象。,然后调用AnimationDrawable.start()方法开始动画。
//拿到这个我们定义的Drawable,实际也就是AnimationDrawable
AnimationDrawable animationDrawable = (AnimationDrawable) iv.getBackground();
animationDrawable.start();//开启动画
三、属性动画(Property Animation)
1、概念
自Android 3.0版本开始,系统给我们提供了一种全新的动画模式,属性动画(property animation),它的功能非常强大,弥补了之前补间动画的一些缺陷,几乎是可以完全替代掉补间动画了。
2、属性动画与补间动画的区别
最大的区别是补间动画就算控件移动到任何位置,控件本身位置还是不变。而属性动画是直接改变控件的位置。
3、ObjectAnimator
ObjectAnimator是属性动画最重要的类,创建一个ObjectAnimator只需通过其静态工厂类直接返还一个ObjectAnimator对象。
使用如下:
// target:需要执行动画的组件
// propertyName:动画类型名字
// values:一组动画变化过程的值。
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(iv, "rotation", 0, 180);
//动画执行的时间
objectAnimator.setDuration(5000);
//动画的重复次数
//ObjectAnimator.INFINITE:无限次
objectAnimator.setRepeatCount(3);
//动画的重复方式
//ObjectAnimator.REVERSE:动画反方向转动
//ObjectAnimator.RESTART:动画将从开始处重新启动
//默认为ObjectAnimator.RESTART
objectAnimator.setRepeatMode(ObjectAnimator.REVERSE);
//开始动画
objectAnimator.start();
关键:propertyName属性。动画类型名字
"X":X轴平移
"Y":轴平移
"rotation":自身平面旋转
"rotationX":3D翻转 X轴不变
"rotationY":3D翻转 Y轴不变
"alpha":透明度
"scaleX":缩放X轴
"scaleY":缩放Y轴
"translationY":Y轴上横向移动
"translationX":X轴上横向移动
4、ValueAnimator
ValueAnimator不提供任何动画效果,它更像一个数值发生器,用来产生有一定规律的数字,从而让调用者控制动画的实现过程。
使用步骤:
1)生成ValueAnimator对象
2)设置动画的监听,addUpdateListener(ValueAnimator.AnimatorUpdateListener listener)
3)利用添加的监听函数获取当前动画的值,getAnimatedValue()
4)设置给View,实现动画
ValueAnimator valueAnimator = ValueAnimator.ofInt(0,200);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
int mInt = (int) animation.getAnimatedValue();
//水平移动200
iv.setX(mInt);
}
});
valueAnimator.start();
5、监听
objectAnimator.addListener(new Animator.AnimatorListener() {
/**
* 动画开始前的操作
* @param animation
*/
@Override
public void onAnimationStart(Animator animation) {
}
/**
* 动画结束的操作
* @param animation
*/
@Override
public void onAnimationEnd(Animator animation) {
}
/**
* 动画取消的操作
* @param animation
*/
@Override
public void onAnimationCancel(Animator animation) {
}
/**
* 动画重复的操作
* @param animation
*/
@Override
public void onAnimationRepeat(Animator animation) {
}
});
如果只关心动画的结束状态:
objectAnimator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
}
});
6、AnimatorSet
AnimatorSet这个类提供了一个play()方法,如果我们向这个方法中传入一个Animator对象(ValueAnimator或ObjectAnimator)将会返回一个AnimatorSet.Builder的实例
AnimatorSet.Builder中包括以下4个方法:
• after(Animator anim):将现有动画插入到传入的动画之后执行。
• after(long delay):将现有动画延迟指定毫秒后执行。
• before(Animator anim):将现有动画插入到传入的动画之前执行。
• with(Animator anim):将现有动画和传入的动画同时执行。
ObjectAnimator alphaObjectAnimator2 = ObjectAnimator.ofFloat(iv,"alpha",1,0.5f,0.2f,0.1f,0.5f,1);
ObjectAnimator scaleXObjectAnimator = ObjectAnimator.ofFloat(iv,"scaleX",1,2,1,2,1);
ObjectAnimator scaleYObjectAnimator = ObjectAnimator.ofFloat(iv,"scaleY",1,2,1,2,1);
AnimatorSet animatorSet = new AnimatorSet();
//执行scaleYObjectAnimator后再同时执行alphaObjectAnimator2和scaleXObjectAnimator
//animatorSet.play(alphaObjectAnimator2).with(scaleXObjectAnimator).after(scaleYObjectAnimator);
//同时执行alphaObjectAnimator2、scaleXObjectAnimator、scaleYObjectAnimator
animatorSet.playTogether(alphaObjectAnimator2,scaleXObjectAnimator,scaleYObjectAnimator);
animatorSet.setDuration(3000);
animatorSet.start();
7、PropertyValuesHolder
还可以使用PropertyValuesHolder类来实现组合动画。不过这个组合动画就没有上面的丰富了,使用PropertyValuesHolder类只能是多个动画一起执行。
PropertyValuesHolder pv1 = PropertyValuesHolder.ofFloat("rotation", 0, 359);
PropertyValuesHolder pv2 = PropertyValuesHolder.ofFloat("scaleX", 1, 2);
PropertyValuesHolder pv3 = PropertyValuesHolder.ofFloat("translationX", 0, 200);
PropertyValuesHolder pv4 = PropertyValuesHolder.ofFloat("alpha", 0.5f, 1f);
//将所有的组合动画添加到ObjectAnimator中
ObjectAnimator oa = ObjectAnimator.ofPropertyValuesHolder(iv, pv1, pv2, pv3, pv4);
oa.setDuration(5000);
oa.start();
8、在XML中使用属性动画
第一步:在res/animator目录下创建xml文件
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
android:duration="2000"
<!--动画执行顺序 sequentially:顺序执行;together:同时执行。 -->
android:ordering="sequentially">
<objectAnimator
android:propertyName="translationX"
android:valueFrom="0"
android:valueTo="200"
android:valueType="floatType" />
<set android:ordering="together">
<objectAnimator
android:propertyName="scaleX"
android:valueFrom="1"
android:valueTo="2"
android:valueType="floatType" />
<objectAnimator
android:propertyName="rotationX"
android:valueFrom="0"
android:valueTo="90"
android:valueType="floatType" />
</set>
</set>
第二步,在代码中加载动画文件
Animator animator = AnimatorInflater.loadAnimator(this, R.animator.anim_file);
animator.setTarget(iv);
animator.start();
本文地址:https://blog.csdn.net/m0_46211029/article/details/107466764
下一篇: 苹果“垃圾桶”暗藏惊喜 这也太彪悍了
推荐阅读
-
读书笔记——《redis入门指南(第2版)》第四章 进阶——4.1-5
-
android Tween动画四种动画效果的实现步骤教程
-
Android中四种补间动画的使用示例(附代码下载)
-
黑马Android76期学习笔记01基础--day07--广播,有、无序广播、特殊广播接受者、样式和主题,this与context的区别、普通对话框,进度条对话框、帧动画
-
《Android进阶之光》--Material Design
-
Android开发笔记(四)字符串格式化
-
Spring学习笔记(四)——IoC进阶篇
-
2020-09-26《Android进阶之光》第一章Android新特性
-
Android动画学习笔记之补间动画
-
Android进阶之光笔记四:动画