Android动画

目录

视图动画

补间动画

alpha/AlphaAinmation透明

scale/ScaleAnimation伸缩尺寸 

rotate/RetetaAnimation旋转

Set/AnimationSet动画集合

帧动画

xml实现

代码实现AnimationDrawable类

属性动画

ValueAnimator

valueAnimator 操作

自定义ofObject

ObjectAnimator

ObjectAnimator使用:

自定义ofObject

AnimatorSet组合

组合

自由组合AnimatorSet.Builder

Xml实现属性动画

插值器

自带插值器

自定义插值器

Interpolator

Evaluator(转换器)


视图动画

补间动画

补间动画可以用xml来定义,存放在res/anim目录下,访问使用R.anim.XXX。
也可以使用Java代码定义

标签使用方法:java代码中使用AnimationUtils.loadAnimation(context,R.animin.XXX) 加载动画,之后将要显示的控件展示动画 tv.startAnimation(animation);

标签属性
标签方法解释
durationsetDuration(long)设置一次动画时间
fillAftersetFillAfter(boolean)ture则控件动画结束时,保持结束时状态
fillBeforesetFillBefore(boolean)true则动画结束时,回复初始化状态
fillEnabledsetFillEnable(boolean)同fillBefore
repeatCountsetRepeatCount(int)动画重复次数,infinite则无线循环
repeatModesetRepeatMode(int)重复类型,reverse倒叙,restart重放
interpolatorsetInterpolator(Intepolator)设置插值器

alpha/AlphaAinmation透明

fromAlpha·动画开始透明度0.0~1.0,0代表全透
toAlpha动画结束透明度

scale/ScaleAnimation伸缩尺寸 

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 
    translate/TranslateAnimation平移
fromXDeltax轴起始坐标,50,50%,50%p
toXDeltax轴终点坐标
fromYDeltay轴起始坐标,50,50%,50%p
toYDeltay轴终点坐标

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)描述
AccelerateDecelerateInterpolatoraccelerate_decelerate_interpolator先加速,后减速
AccelerateInterpolatoraccelerate_interpolator加速
AniticipateInterpolator(可传float参数)anticipate_interpolator(android:tension)初始偏移,参数代表张力,默认2
AnticipateOvershootInterpolator(可传1个或2个float参数)

anticipate_overshoot_interpolator(android:tension、android:extraTension

)

初始、结束都偏移
BounceInterpolatorbounce_interpolator弹跳,模拟自由落体弹跳
CycleInterpolator(传入float 参数代表次数)cycle_interpolator循环,动画循环播放次数
DecelerateInterpolatordecelerate_interpolator减速
LinearInterpolatorlinear_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 插值器结束值,方法返回插值器当前值

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值