Android动画系列——补间动画(Tween动画)
程序员文章站
2022-03-16 19:17:10
...
动画系列——补间动画(Tween动画)
补间动画也叫渐变动画,对特定的对象做图像变换如平移、缩放、旋转、淡出/淡入等
动画类型 | XML节点 | 使用的java类 |
---|---|---|
透明 | alpha | AlphaAnimation |
缩放 | scale | ScaleAnimation |
移动 | translate | TranslateAnimation |
旋转 | rotate | RoateAnimation |
动画集合 | set | AnimationSet |
属性解析
通用属性
属性名 | 解析 |
---|---|
duration | 动画持续时间 |
fillAfter | 设为true,动画结束时,保持动画最后时状态 |
fillBefore | 设置true,动画结束时,动画还原到初始化状态 |
fillEnabled | 同fillBefore |
repeatCount | 重复次数 |
repeatMode | 重复类型,reverse:倒序播放,restart:重新播放 |
duration | 单次动画持续时间,单位毫秒 |
注:无限循环,repeatCount设置-1,同时配合repeatMode使用
缩放动画
属性名 | 解析 |
---|---|
fromXScale | 起始X方向相对自身的缩放比例,浮点值。1.0:无变化,0.5缩小一倍 |
toXScale | 结尾X方向相对自身的缩放比例 |
fromYScale | 起始Y方向相对自身的缩放比例 |
toYScale | 结尾Y方向相对自身的缩放比例 |
pivotX | 缩放起点的X轴坐标,可以是数值,百分数,百分数p 数值:如50,当前View的左上角X轴坐标 + 50px作为动画起点 百分数:如50%,当前View的左上角X轴坐标 + 自身X轴方向宽度的50%作为动画起点 |
百分数p:如50%P,当前View左上角X轴坐标 + 父控件X轴方向宽度50%作为动画起点 | |
pivotY | 缩放起点的X轴坐标,同pivotX |
透明动画
属性名 | 解析 |
---|---|
fromAlpha | 动画开始时的透明度,从0.0-1.0,0.0:全透明,1.0:完全不透明 |
toAlpha | 动画结束时的透明度 |
旋转动画
属性名 | 解析 |
---|---|
fromDegrees | 开始旋转的角度位置,正直:顺时针方向度数,反之同理 |
toDegrees | 结束时旋转到的角度位置 |
pivotX | 同缩放 |
pivotY | 同缩放 |
平移动画
属性名 | 解析 |
---|---|
fromXDelta | 起始点的X轴坐标,具体数值同pivotX |
fromYDelta | 起始点的Y轴坐标 |
toXDelta | 结束点的X轴坐标 |
toYDelta | 结束点的Y轴坐标 |
使用XML实现
在res/anim 目录下创建set.xml文件
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:fillAfter="false" >
<alpha
android:fromAlpha="0.0"
android:toAlpha="1.0"
android:duration="2000"
android:repeatCount="infinite"
android:repeatMode="reverse" >
</alpha>
<rotate
android:duration="2000"
android:fromDegrees="0"
android:pivotX="50%"
android:pivotY="50%"
android:repeatCount="2"
android:repeatMode="reverse"
android:toDegrees="360" >
</rotate>
</set>
//单个动画所用方法一致
Animation set = AnimationUtils.loadAnimation(this, R.anim.set);
iv.startAnimation(set);
使用代码实现
构造方法解析
AlphaAnimation(float fromAlpha, float toAlpha);
//fromAlpha: 动画的起始alpha值 (范围:0:完全透明 1:完全不透明)
//toAlpha:终止的值,动画结束的值
TranslateAnimation(int fromXType, float fromXValue, int toXType, float toXValue,
int fromYType,float fromYValue,int toYType, float toYValue)
//fromXType(起点,相对于原点偏移方式)
Animation.ABSOLUTE 绝对值,像素值
Animation.RELATIVE_TO_SELF 相对于自己
Animation.RELATIVE_TO_PARENT 相对于父控件
//fromXValue(起点,相对于原点偏移量),绝对值/百分比
ScaleAnimation(float fromX,float toX,float fromY,float toY,
int pivotXType,float pivotXValue,int pivotYType, float pivotYValue)
//fromX: 缩放起始比例-水平方向
//toX: 缩放最终比例-水平方向
//pivotXType(中心点相较于原点 x方向的类型):
//pivotXValue: 绝对值/百分比
RotateAnimation(float fromDegrees,float toDegrees,int pivotXType,float pivotXValue, int pivotYType, float pivotYValue)
通用方法
setDuration(3000); // 每次动画持续时间3秒
setFillAfter(true); // 动画最后停留在终止的状态
setRepeatCount(3); // 动画重复的次数
setRepeatMode(Animation.REVERSE); // REVERSE: 反转模式 RESTART:重新开始
setInterpolator(new BounceInterpolator(2f)); // 设置特效
start();
cancle();
AnimationSet set = new AnimationSet(false);
AlphaAnimation al = new AlphaAnimation(0,1);
RotateAnimation ra = new RotateAnimation(0, 360
, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
ScaleAnimation sa = new ScaleAnimation(0.2f, 2.0f, 0.2f, 2.0f
,Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
TranslateAnimation ta = new TranslateAnimation(
Animation.RELATIVE_TO_SELF,0, Animation.RELATIVE_TO_SELF,1f
,Animation.RELATIVE_TO_SELF,0,Animation.RELATIVE_TO_SELF,1f);
set.addAnimation(al);
set.addAnimation(ra);
set.addAnimation(sa);
set.addAnimation(ta);
iv.startAnimation(set);
小结:Animation子类中的构造方法参数,如type类型为RELATIVE_TO_SELF或RELATIVE_TO_PARENT,则其后参数为百分比形式,否则为实际像素值
Animation类
//继承关系
Animation
AnimationSet
ScaleAnimation
TranslateAnimation
AlphaAnimation
RotateAnimation
//嵌套类关系
Animation
AnimationListener //动画监听器
Description
常量
常量名 | 解析 |
---|---|
ABSOLUTE | 像素的绝对数量 |
INFINITE | 无限期重复动画 |
RELATIVE_TO_PARENT RELATIVE_TO_SELF |
指定的维度浮点数,相对于父控件,自身 |
RESTART REVERSE |
动画重复方式,重新开始与反复开始 |
START_ON_FIRST_FRAME | 动画开始延时时间 |
ZORDER_BOTTOM ZORDER_NORMAL ZORDER_TOP |
动画持续方式,分别为强制动画内容在所有其他内容下,按Z轴顺序,上 |
公共方法
方法 | 解析 |
---|---|
cancel() | 取消动画 |
long computeDurationHint() | 计算一个暗示整个动画可能会持续多长时间 |
getBackgroundColor() setBackgroundColor() |
动画背后的背景颜色 |
getDetachWallpaper() setDetachWallpaper() |
setDetachWallpaper(boolean)中设置的值,初始化中设置的 |
getShowWallpaper() | 如果作为窗口动画运行,则返回在动画期间是否显示壁纸 |
getDuration() setDuration() |
动画持续时间 |
getFillAfter() setFillAfter() |
设置动画结束后状态,true:停留在动画结束状态,false:停留在动画开始状态 |
getFillBefore() setFillBefore() |
设置动画开始状态? |
getInterpolator() setInterpolator() |
设置动画加速度曲线类型 |
getRepeatCount() setRepeatCount() |
设置动画重复次数 |
getRepeatMode() setRepeatMode() |
设置动画重复模式 |
getStartOffset() setStartOffset() |
设置开始动画延迟时间 |
getStartTime() setStartTime() |
指定开始动画的时间,传入某个时间点的毫秒值 |
getScaleFactor() | |
getTransformation(long currentTime, Transformation outTransformation) | 获取要在指定时间点应用的转换 |
getZAdjustment() setZAdjustment() |
设置运行动画时要使用的Z轴排序模式 |
hasEnded() | 判断动画是否结束 |
hasStarted() | 判断动画是否开始 |
isFillEnabled() | 返回运行动画时要使用的Z排序模式 |
isInitialized() initialize() |
判断动画是否初始化 |
reset() | 重置动画初始化状态 |
restrictDuration() | 限定动画最长的持续时间 |
scaleCurrentDuration() | 缩放持续时间 |
setAnimationListener() | 设置动画监听器 |
start() | 开始动画 |
startNow() | 立即开始动画,内部调用setStartTime(当前时间的毫秒值) |
boolean willChangeBounds() | 判断此动画是否会影响动画视图的边界,透明度动画不会,移动动画会 |
boolean willChangeTransformationMatrix() | 判断此动画是否会影响变换矩阵 |
detach() | |
setListenerHandler() | 设置用于调用监听器的处理程序 |
hasAlpha() | 判断动画是否改变view的透明度 |
getInvalidateRegion() initializeInvalidateRegion() |
AnimationSet类
除上述公用API外,还有下面几种API
方法 | 解析 |
---|---|
addAnimation() | 添加补间动画,一次只能添加一个 |
getAnimations() | 获取补间动画集合(ArrayList) |
restoreChildrenStartOffset() |
Animation执行过程
启动动画时,调用View类的startAnimation(anim);
//1 startAnimation()解析
public void startAnimation(Animation animation) {
animation.setStartTime(Animation.START_ON_FIRST_FRAME);
//设置当前动画
setAnimation(animation);
invalidateParentCaches();
//重绘
invalidate(true);
}
protected Animation mCurrentAnimation = null;
public void setAnimation(Animation animation) {
mCurrentAnimation = animation;
......
}
//2 draw()解析
boolean draw(Canvas canvas, ViewGroup parent, long drawingTime) {
// ......
final Animation a = getAnimation();
if (a != null) {
more = applyLegacyAnimation(parent, drawingTime, a, scalingRequired);
}
// ......
}
public Animation getAnimation() {
return mCurrentAnimation;
}
private boolean applyLegacyAnimation(ViewGroup parent, long drawingTime,
Animation a, boolean scalingRequired) {
......
boolean more = a.getTransformation(drawingTime, t, 1f);
......
}
//3 Animation类的applyTransformation()
public boolean getTransformation(long currentTime, Transformation outTransformation,float scale) {
mScaleFactor = scale;
return getTransformation(currentTime, outTransformation);
}
public boolean getTransformation(long currentTime, Transformation outTransformation) {
......
applyTransformation(interpolatedTime, outTransformation);
......
}
上一篇: 小米AX6000路由器值得买吗? 小米AX6000拆解测评
下一篇: Tween动画