android动画分为三种 帧动画,视图动画(补间动画),属性动画
逐帧动画
image.setBackgroundResource(R.anim.anim_frame);
AnimationDrawable anim = (AnimationDrawable) image.getBackground();
anim.start();
视图动画
view = new ImageView(context);
//四种视图动画,透明度,旋转,平移,缩放
AlphaAnimation animation0 = new AlphaAnimation(0,1);//(float fromAlpha, float toAlpha)
RotateAnimation animation1 = new RotateAnimation(0,360,100,100);//(float fromDegrees, float toDegrees)
TranslateAnimation animation2 = new TranslateAnimation(0,200,0,300);//(float fromXDelta, float toXDelta,float fromYDelta, float toYDelta)
ScaleAnimation animation3 = new ScaleAnimation(0,2,0,2);//(float fromX, float toX, float fromY, float toY)
animation0.setDuration(1000);
view.startAnimation(animation0);
//动画集合
AnimationSet animationSet = new AnimationSet(true);//(boolean shareInterpolator)是否共用一个插值器
animationSet.addAnimation(animation0);
animationSet.setDuration(1000);
animationSet.addAnimation(animation1);
animationSet.addAnimation(animation3);
animationSet.addAnimation(animation3);
view.startAnimation(animationSet);
animationSet.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
属性动画
/**
* ObjectAnimator只能控制一个属性,要操纵的属性必须有set,get方法
* 常用属性
* translationX,translationY
* rotation,rotationX,rotationY
* scaleX,scaleY
* pivotX,pivotY
* alpha
* x,y
*/
ObjectAnimator objectAnimator =ObjectAnimator.ofFloat(view,"translationX",300);
objectAnimator.setDuration(1000);
objectAnimator.start();
/**
* 如果没有属性,可以通过ValueAnimator或者使用包装类ViewWrapper
* public final class ObjectAnimator extends ValueAnimator
*/
ValueAnimator valueAnimator = ValueAnimator.ofFloat(0,100);
valueAnimator.setDuration(1000);
valueAnimator.setTarget(view);
valueAnimator.start();
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
}
});
/**
* 属性动画集合
* playSequentially();
* play().after().with().before()
*/
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.playTogether(objectAnimator,valueAnimator);
animatorSet.start();
Window和Activity切换动画
<style name="window">
<item name="android:windowEnterAnimation">@anim/slide_left_enter</item>
<item name="android:windowExitAnimation">@anim/slide_right_exit</item>
</style>
style的id传给WindowManager.LayoutParams.windowAnimation或者构造函数
<style name="activity" >
<item name="android:activityOpenEnterAnimation">@android:anim/slide_in_left</item>
<item name="android:activityOpenExitAnimation">@android:anim/slide_out_right</item>
<item name="android:activityCloseEnterAnimation">@anim/push_right_in</item>
<item name="android:activityCloseExitAnimation">@anim/push_left_out</item>
</style>
<style name="mytheme" parent="@android:style/Theme">
<item name="@android:windowAnimationStyle">@style/activity </item>
</style>
XML中定义动画
补间动画 res/anim文件夹下 帧动画 res/drawable文件夹
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha
android:duration="500"
android:fromAlpha="1.0"
android:toAlpha="0.0" />
<scale
android:duration="10000"
android:fromXScale="0.0"
android:fromYScale="0.0"
android:interpolator="@android:anim/decelerate_interpolator"
android:pivotX="50%"
android:pivotY="50%"
android:repeatCount="1"
android:repeatMode="reverse"
android:startOffset="0"
android:toXScale="1.5"
android:toYScale="1.5" />
<translate
android:duration="10000"
android:fromXDelta="320"
android:fromYDelta="480"
android:toXDelta="0"
android:toYDelta="0" />
<rotate
android:duration="10000"
android:fromDegrees="300"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:pivotX="10%"
android:pivotY="100%"
android:toDegrees="-360" />
</set>
透明:
android:fillAfter 如果设置为true,控件动画结束时,将保持动画最后时的状态
android:fillBefore 如果设置为true,控件动画结束时,还原到开始动画前的状态
android:fillEnabled 与android:fillBefore 效果相同,都是在动画结束时,将控件还原到初始化状态
android:repeatCount 重复次数
android:repeatMode 重复类型,有reverse和restart两个值,reverse表示倒序回放,restart表示重新放一遍,必须与repeatCount一起使用才能看到效果。
android:interpolator 设定插值器
android:startOffset 动画多次执行的间隔时间,如果只执行一次,执行前会暂停这段时间,单位毫秒 duration,一次动画效果消耗的时间,单位毫秒,值越小动画速度越快
android:pivotX 属性为动画相对于物件的X坐标的开始位置
android:toXDelta 动画结束时X,Y的座标
属性动画:
<animator>、<objectAnimator>、<set>
android:duration 动画从开始到结束持续的时长,单位为毫秒
android:startOffset 设置动画执行之前的等待时长,单位为毫秒
android:repeatCount 设置动画重复执行的次数,默认为0,即不重复;可设为-1或infinite,表示无限重复
android:repeatMode 设置动画重复执行的模式,可设为以下两个值其中之一:
restart 动画重复执行时从起点开始,默认为该值
reverse 动画会反方向执行
android:valueFrom 动画开始的值,可以为int值、float值或color值
android:valueTo 动画结束的值,可以为int值、float值或color值
android:valueType 动画值类型,若为color值,则无需设置该属性
intType 指定动画值,即以上两个value属性的值为整型
floatType 指定动画值,即以上两个value属性的值为浮点型,默认值
android:interpolator 设置动画速率的变化,比如加速、减速、匀速等,需要指定Interpolator资源。
<animator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="3000"
android:valueFrom="100"
android:valueTo="20"
android:valueType="intType" />
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="together">
<objectAnimator
android:duration="3000"
android:propertyName="width"
android:valueFrom="100"
android:valueTo="20"
android:valueType="intType" />
<objectAnimator
android:duration="3000"
android:propertyName="marginTop"
android:valueFrom="0"
android:valueTo="100"
android:valueType="intType" />
</set>
当属性动画没有get和set方法是,提要提供一个包装类来设置
private void performAnimate() {
ViewWrapper wrapper = new ViewWrapper(mButton);
ObjectAnimator.ofInt(wrapper, "width", 500).setDuration(5000).start();
}
@Override
public void onClick(View v) {
if (v == mButton) {
performAnimate();
}
}
private static class ViewWrapper {
private View mTarget;
public ViewWrapper(View target) {
mTarget = target;
}
public int getWidth() {
return mTarget.getLayoutParams().width;
}
public void setWidth(int width) {
mTarget.getLayoutParams().width = width;
mTarget.requestLayout();
}
}
网友评论