Android动画系列——补间动画(Tween动画)

动画系列——补间动画(Tween动画)

补间动画也叫渐变动画,对特定的对象做图像变换如平移、缩放、旋转、淡出/淡入等

动画类型XML节点使用的java类
透明alphaAlphaAnimation
缩放scaleScaleAnimation
移动translateTranslateAnimation
旋转rotateRoateAnimation
动画集合setAnimationSet

属性解析

通用属性

属性名解析
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);
   ......
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值