欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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);
   ......
}