第7章 Android动画深入浅析
分类:View动画、帧动画、属性动画
View动画
四种效果,平移(TranslateAnimation)、缩放(ScaleAnimation)、旋转(RotateAnimation)、透明度(AlphaAnimation)。
都可以采用Java和XML,XML可读性更好。
<?xml version="1.0" encoding="utf-8"?> <setxmlns:android="http://schemes.android.com/apk/res/android" android:interpolator="@[package:]anim/interpolator_resource"//差值器 android:shareInterpolator=["true"|"false"]> <alpha android:fromAlpha="float" //透明度起始值 android:toAlpha="float"/> //透明度结束值 <scale android:fromXScale="float" //水平方向缩放的起始值 android:toXScale="float" //水平方向缩放的结束值 android:fromYScale="float" //竖直方向缩放的起始值 android:toYScale="float" //竖直方向缩放的结束值 android:pivotX="float" //缩放的轴点x坐标,会影响缩放效果 android:prvotY="float"/> //缩放的轴点y坐标,会影响缩放效果 <translate android:fromXDelta="float" //x起始值 android:toXDelata="float" //x结束值 android:fromYDealta="float" //y的起始值 android:toYDelata="float"/> //y的结束值 <rotate android:fromDegrees="float" //旋转开始的角度 android:toDegrees="float" //旋转结束的角度 android:pivotX="float" //旋转的轴点x坐标 android:prvotY="float"/> //旋转的轴点的y坐标 </set>
另外还有常用属性
android:duration——持续时间
android:fillAfter——动画结束之后View是否停留在结束位置
使用XML的动画:
Animation anim =AnimationUtils.loadAnimation(this,R.anim,animation);
mBtn.startAnimation(anim);
Animation的setAnimationListener对View的动画做监听。
特殊View动画:
LayoutAnimation,为ViewGroup设置android:layoutAnimation属性;
Activity切换Animation,overridePendingTransition(R.anim.enter_anim,R.anim.exit_anim);
帧动画
顺序播放一组预先处理的图片,使用了AnimationDrawable。尽量避免大图片防止oom
标签采用<animation-list>。
Button mBtn =(Button)findViewById(R.id.btn);
mBtn.setBackgroundResource(R.drawable.fram_animation);
AnimationDrawable drawable =(AnimationDrawable)mBtn.getBackground();
drawable.start();
属性动画
Nineoldandroids兼容。常见的动画类:ValueAnimator、ObjectAnimator、AnimatorSet(动画集)。
ValueAnimator本身不作用于任何对象,但是它可以对一个值做动画,可以监听动画过程onAnimationUpdate,在动画中改变实际对象的属性值。
在XML定义,res/animator目录下
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:ordering=["together"|"sequentially"]> <objectAnimator android:duration="int" android:propertyName="string" //属性动画作用对象属性的名称 android:repeatCount="int" //重复次数,-1表示无线循环 android:repeatMode=["restart"|"reverse"] //动画重复模式 android:startOffset="int" //动画开始后,延时多少毫秒才会真正播放次动画 android:valueFrom="float|int|color" //属性起始值 android:valueTo="float|int|color" //属性结束值 android:valueType=["intType"|"floatType"] /> //属性的类型那个为整型还是浮点型 <animator ... /> </set>
AnimatorSet set =(AnimatorSet)AnimatorInflater.loadAnimation(myContext,R.anim.property_animator);
set.setTarget(mBtn);
set.start();
最好是在代码中去实现,因为有些属性在xml里无法知道初始值。
对任意属性做动画:
对Object的属性abc做动画,如果想让动画生效需要条件:
1、Object必须提供setAbc方法,如果动画时候没有传递初始值,还要提供getAbc;
2、Object的setAbc对属性abc所改变必须能够通过改变反映出来;
如果条件2不满足,有三种解决方法。
1、给对象加上get和set方法,如果有权限的话;
2、用一个类包装原始对象,间接为其提供get和set方法;
privatevoid performAnimate(){ ViewWrapper wrapper =newViewWrapper(mBtn); ObjectAnimaton.ofInt(wrapper,"width",500).setDuration(5000).start(); privatestaticclassViewWrapper{ privateView mTarget; publicViewWrapper(View target){ mTarget=target; } publicint getWidth(){ return mTarget.getLayoutParams.width; } publicvoid setWidth(int width){ mTarget.getLayoutParams().width=width; mTarget.requestLayout; } }
3、采用ValueAnimator,监听动画过程,自己实现属性的改变;
勿忘初衷

浙公网安备 33010602011771号