目录
视图动画
补间动画
补间动画可以用xml来定义,存放在res/anim目录下,访问使用R.anim.XXX。
也可以使用Java代码定义标签使用方法:java代码中使用AnimationUtils.loadAnimation(context,R.animin.XXX) 加载动画,之后将要显示的控件展示动画 tv.startAnimation(animation);
标签属性 标签 方法 解释 duration setDuration(long) 设置一次动画时间 fillAfter setFillAfter(boolean) ture则控件动画结束时,保持结束时状态 fillBefore setFillBefore(boolean) true则动画结束时,回复初始化状态 fillEnabled setFillEnable(boolean) 同fillBefore repeatCount setRepeatCount(int) 动画重复次数,infinite则无线循环 repeatMode setRepeatMode(int) 重复类型,reverse倒叙,restart重放 interpolator setInterpolator(Intepolator) 设置插值器 alpha/AlphaAinmation透明
fromAlpha ·动画开始透明度0.0~1.0,0代表全透 toAlpha 动画结束透明度 scale/ScaleAnimation伸缩尺寸
translate/TranslateAnimation平移
fromXScale 动画起始时控件X轴相对自身缩放比例1.0无变化,0.5缩小1倍,2.0放大一倍 toXScale 动画结束时控件X轴相对自身缩放比例 pivotX 缩放起始位置点X坐标。50 代表起始原坐标基础上加50像素,坐标(50,Y);50%代表原坐标基础上加上自身宽度的50%;50%p代表在原坐标基础加父控件的50%。 fromYScale toYScale pivotY
fromXDelta x轴起始坐标,50,50%,50%p toXDelta x轴终点坐标 fromYDelta y轴起始坐标,50,50%,50%p toYDelta y轴终点坐标 rotate/RetetaAnimation旋转
fromDegrees 开始旋转时角度位置,正代表顺时,夫代表逆时读书 pivotX 旋转中心点x轴坐标位置,默认是坐标原点,值通scale标签 toDegrees pivotY Set/AnimationSet动画集合
用于将以上动画合起来
标签使用时 <set .....> <alpha ...../> <scale ..../> </set>
Java代码使用时 AnimationSet setAnim=new AnimationSet(true); setAnim.addAnimation(Animation);
帧动画
xml实现
1.定义xml动画文件,存放在res/anim 或res/drawable目录下
<?xml...?> <animation-list .... android:oneshot="true" > 执行一次,fales为循环 <item android:drawbale="...." android:duration="1000"/> 展示毫秒数 </animation-list>
2.xml文件中使用动画
<ImageView .... android:background="动画文件" 或 android:src="动画文件" />
3.在代码中开始动画
AnimationDrawable ad=image.getDrawable();// 或者image.getBackground(); anim.start();
代码实现AnimationDrawable类
new一个AnimationDrawable类,设置成控件src或背景
AnimationDrawable ad=new AnimationDrawable(); int id=getResources().getIdentifier("文件名","drawable(文件类型)",getPackaeName()(应用包名)); //获取资源id,用其他方式也可以 Drawable dd=getResources().getDrawable(id); //id也可以是R.drawable.xxx anim.addFrame(dd,1000);//添加1帧 anim.start(); /** AnimationDrawable 常用函数 void start(); 开始播放 void stop(); 停止播放 int getDuration(int index) 得到指定index帧时间 Drawable getFrame(int index) 得到第index帧对象 int getNumberOfFrames() 得到当前AnimationDrawable的帧数 boolean isRunning() 是否在播放 void setOneShot(boolean oneShot) 设置是否播放一次 boolean isOneShow() 是否播放一次 void addFrame(Drawable frame, int duration) 添加1帧 */
属性动画
用于尼伯视图动画不足,例如控件移动后,点击控件响应的位置没变等
ValueAnimator
valueAnimator 操作
valueAnimator 不会对控件执行任何操作,可设定从一个值移动到另一个值,并监听值的变化过程
//创建实例 ValueAnimator va=ValueAnimator.ofInt(0,400); va.setDuration(1000); va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener(){ @Override public void onAnimationUpdate(ValueAnimator animation){ int curValue=animation.getAnimatedValue(); //在这里使用变化的值,直接改变控件的4个点坐标。如此变化后控件响应位置一起变 tv.layout(curValue,curValue,curValue+tv.getWidth(),curValue+tv.getHeight(); } }); va.addListener(new Animator.AnimatorListener(){ ... /* 监听动画变化,共4个状态 onAnimationStart(Animator) 动画开始 onAnimationEnd(Animator) 动画结束 onAnimationCancel(Animator) 动画取消 onAnimationRepeat(Animator) 动画重复 */ }); /* 常用函数 ValueAnimator ofInt(int... values) 例如 ofInt(1,30,50) 表示由1变为30,再变到50 ValueAnimator ofFloat(float... values) setDuration(long) 动画时长 getAnimatedValue() 获取运动点当前值 setRepeatCount(int) 设置循环次数 ValueAnimation.INFINITE代表无限循环 setRepeatMode(int) 设置循环模式ValueAnimation.RESTART代表正循环ValueAnimation.REVERSE代表倒叙 cancel() setStartDelay(long) 设置延时多久后开始动画 */ /* 移除监听器 removeUpdateListener(AnimatorUpdateListener) removeAllUpdateListeners() removeListener(AnimatorListener) removeAllListener() */
自定义ofObject
ofObject(TypeEvaluator,object...)传入转换器和任意类型长参数
ObjectAnimator
是ValueAnimation派生类,简化操作
ObjectAnimator使用:
ObjectAnimator oa=ObjectAnimator.ofFloat(Object target,String propertyName,float... values);
target:指要操作的控件
propertyName:操作控件的属性,使用反射
透明:"alpha",对应属性setApha(float)
z轴旋转:“rotation”,对应属性setRotatio(float)
X轴旋转:“rotationX”,对应属性setRotatioX(float)
Y轴旋转:“rotationY”,对应属性setRotatioY(float)
x轴平移:"translationX",对应属性setTranslationX(float)
y轴平移:"translationY",对应属性setTranslationY(float)
x轴缩放:"scaleX",对应属性setScaleX(float)
y轴缩放:"scaleY",对应属性setScaleY(float)
values:属性的变化值
自定义ofObject
objectAnimator有3个构造函数ofFloat、ofInt、ofObjectt(Object target,String propertyName,TypeEvaluator evaluator,Object... values);
ofObject使用方法同valueAnimator
反射propertyName对应的控件set方法,应首字母大写如setTest(....),并且控件需有个对应的getTest()方法,用于定义变化前的初始默认值
AnimatorSet组合
组合
playSequentially(Animator....items)
playSequentially(List<Animator> items);
传入的动画依次播放
playTogether(Animator....items)
playTogether(List<Animator> items);
传入动画一起播放
这两个方法在开始动画时知识把美感动画激活,动画自身延时、循环只与空间自身动画设定相关
自由组合AnimatorSet.Builder
常用函数 Builder play(Animator);//播放这个动画 Builder whit(Animator);//以play为基准,一起播放 Builder before(Animator);//先播放play在播放before Builder after(Animator);//先播放after在播放play Builder after(long);//延迟x毫秒后播放 使用方法 AnimatorSet.Builder builder=animatorSet.play(Animator); builder ....添加其他播放动画
AnimatorSet监听
添加方式addListener(AnimatorListener);
监听方法:
onAnimationStart(Animator); 开始调用
onAnimationEnd(Animator)结束调用
onAnimationCancel(Animator)取消调用
onAnimationRepeat(Animator)重复调用
AnimatorSet常用函数
setDuration(long)单次动画时长
setInterpolator(TimeInterpolator)设置插值器
setTarget(Object)动画目标控件
setStartDelay(long)延时开始动画时长
Xml实现属性动画
标签:
<animator/>对应ValueAnimator
<objectAnimator/>对应ObjectAnimator
<set/>对应AnimatorSet
<animator/>属性
duration=“int”动画播放时长
valueFrom="float|int|color" 初始动画值
valueTo="float|int|color" 结束动画值
startOffset="int"动画激活时间
repeatCount="int"动画重复次数
repeatMode="repeat"|"reverse"动画重复模式 正序|倒叙
valueType="intType"|"floatType"参数值类型
interpolator="@android:interpolator/...."设置插值器
<objectAnimator/>标签多一个propertyName="string"字段对应属性名
插值器
自带插值器
用于设置动画速率变化
xml 引用插值器 <?xml....?> <alpha ..... android:interpolator="@android:anim/...> </alpha>
代码使用插值器 anim 是一个Animation类或其子类 anim.setInterpolator(new LinearInterpolator());
java类 xml引用id(@android:anim/xxx) 描述 AccelerateDecelerateInterpolator accelerate_decelerate_interpolator 先加速,后减速 AccelerateInterpolator accelerate_interpolator 加速 AniticipateInterpolator(可传float参数) anticipate_interpolator(android:tension) 初始偏移,参数代表张力,默认2 AnticipateOvershootInterpolator(可传1个或2个float参数) anticipate_overshoot_interpolator(android:tension、android:extraTension
)
初始、结束都偏移 BounceInterpolator bounce_interpolator 弹跳,模拟自由落体弹跳 CycleInterpolator(传入float 参数代表次数) cycle_interpolator 循环,动画循环播放次数 DecelerateInterpolator decelerate_interpolator 减速 LinearInterpolator linear_interpolator 匀速 OvershootInterpolator(可穿float参数) overshoot_interpolatorandroid:tension) 结束偏移,默认2,值越大,偏移越大
自定义插值器
Interpolator
实现接口Interpolator,这个接口继承自TimeInterpolator。
其中有个方法 float getInterpolation(float input)。input的取值范围为0~1 ,代表动画进度。返回值为实际显示进度,可以大于1(目标位置),也可以小于0(起始位置)
Evaluator(转换器)
通过监听拿到的是当前动画对应的具体数值,非小数表示数值。需用Evaluator根据当前数值进度将其转换为对应数值
设置时 animator.setEvaluator(new IntEvaluator());
当设置IntEvaluator时,使用ValueAnimator.ofInt() 构造;当设置FloatEvaluator时,使用Value.Animator.offloat()构造
ArgbEvaluator,颜色值过度转换
实现Evaluator
实现TypeEvaluator接口。并指定类型如TypeEvaluator<Integer>,实现evaluate方法,并返回对应数值。返回的数值在动画
valueAnimator.addUpdateListener 里得到的valueAnimator.getAnimatedValue();
evaluate方法参数:fractoion 显示进度,startValue 插值器起始值,endValue 插值器结束值,方法返回插值器当前值