总所周知Android动画分为3类:
一、Frame Animation:(逐帧动画)一帧帧的播放图片,利用人眼视觉残留原理,给我们带来动画的感觉。它的原理的GIF图片、电影播放原理一样。
主要用于播放一帧帧准备好的图片,类似GIF图片,优点是使用简单方便、缺点是需要事先准备好每一帧图片;
二、Tween Animation:(补间动画)补间动画就是我们只需指定开始、结束的“关键帧“,而变化中的其他帧由系统来计算,不必自己一帧帧的去定义。
仅需定义开始与结束的关键帧,而变化的中间帧由系统补上,优点是不用准备每一帧,缺点是只改变了对象绘制,而没有改变View本身属性。因此如果改变了按钮的位置,还是需要点击原来按钮所在位置才有效。
三、Property Animation:(属性动画) 属性动画只对Android 3.0(API 11)以上版本的Android系统才有效,这种动画可以设置给任何Object,包括那些还没有渲染到屏幕上的对象。这种动画是可扩展的,可以让你自定义任何类型和属性的动画。
是3.0后推出的动画,优点是使用简单、降低实现的复杂度、直接更改对象的属性、几乎可适用于任何对象而仅非View类,缺点是需要3.0以上的API支持,限制较大!但是目前国外有个开源库,可以提供低版本支持!
Frame Animation:(逐帧动画):
特别注意,AnimationDrawable的start()方法不能在Activity的onCreate方法中调运,因为AnimationDrawable还未完全附着到window上,所以最好的调运时机是onWindowFocusChanged()方法中。
<!-- 注意:rocket.xml文件位于res/drawable/目录下 -->
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot=["true" | "false"] >
<item
android:drawable="@[package:]drawable/drawable_resource_name"
android:duration="integer" />
</animation-list>
ImageView rocketImage = (ImageView) findViewById(R.id.rocket_image);
rocketImage.setBackgroundResource(R.drawable.rocket_thrust);
rocketAnimation = (AnimationDrawable) rocketImage.getBackground();
rocketAnimation.start();
Tween(补间)动画:
java类名 xml关键字 描述信息
AlphaAnimation <alpha> 放置在res/anim/目录下 渐变透明度动画效果
RotateAnimation <rotate> 放置在res/anim/目录下 画面转移旋转动画效果
ScaleAnimation <scale> 放置在res/anim/目录下 渐变尺寸伸缩动画效果
TranslateAnimation <translate> 放置在res/anim/目录下 画面转换位置移动动画效果
AnimationSet <set> 放置在res/anim/目录下 一个持有其它动画元素alpha、scale、translate、rotate或者其它set元素的容器
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.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"
android:pivotY="float" />
<translate
android:fromXDelta="float"
android:toXDelta="float"
android:fromYDelta="float"
android:toYDelta="float" />
<rotate
android:fromDegrees="float"
android:toDegrees="float"
android:pivotX="float"
android:pivotY="float" />
<set>
...
</set>
</set>
ImageView spaceshipImage = (ImageView) findViewById(R.id.spaceshipImage);
Animation hyperspaceJumpAnimation = AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump);
spaceshipImage.startAnimation(hyperspaceJumpAnimation);
Property Animation:(属性动画):
XML方式属性动画:
在xml中可直接用的属性动画节点有ValueAnimator、ObjectAnimator、AnimatorSet。
XML属性动画使用方法:
AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(myContext,
R.animtor.property_animator);
set.setTarget(myObject);
set.start();
Java方式属性动画:
ObjectAnimator.ofFloat(view, "rotationY", 0.0f, 360.0f).setDuration(1000).start();
ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f);
anim.setDuration(300);
anim.start();
myView.animate().x(0f).y(100f).start();
属性动画综合案例:
ValueAnimator anim = ValueAnimator.ofInt(0, 500);
anim.setDuration(5000);
anim.setTarget(tv);
anim.setStartDelay(1000);
anim.setRepeatCount(ObjectAnimator.INFINITE);
anim.setRepeatMode(ObjectAnimator.REVERSE);
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
int currentValue = (int) animation.getAnimatedValue();
Log.d("TAG", "cuurent value is " + currentValue);
tv.layout(currentValue, currentValue * 2,
currentValue + tv.getWidth(),
currentValue * 2 + tv.getHeight());
}
});
anim.addListener(new AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
Log.d("TAG", "动画开始");
}
@Override
public void onAnimationRepeat(Animator animation) {
Log.d("TAG", "动画重复");
}
@Override
public void onAnimationEnd(Animator animation) {
Log.d("TAG", "动画结束");
}
@Override
public void onAnimationCancel(Animator animation) {
Log.d("TAG", "动画取消");
}
});
// anim.start();
ValueAnimator anim2 = ValueAnimator.ofInt(0, 255);
anim2.setDuration(2000000);
anim2.setTarget(tv);
anim2.setStartDelay(1000);
anim2.setRepeatCount(ObjectAnimator.INFINITE);
anim2.setRepeatMode(ObjectAnimator.REVERSE);
anim2.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
int currentValue = (int) animation.getAnimatedValue();
tv.setAlpha(currentValue / 255);
}
});
AnimatorSet animSet = new AnimatorSet();
// with,随着,after,后,before之前
animSet.play(anim).with(anim2);
animSet.setDuration(5000);
animSet.start();
// anim.cancel();//取消
// removeListener(AnimatorListenerlistener)用于在animator中移除指定的监听器
// 而removeAllListeners()用于移除animator中所有的AnimatorListener监听器
// 克隆一个新的ValueAnimator,然后开始动画
// ValueAnimator newAnimator = anim.clone();
// newAnimator.setStartDelay(1000);
// newAnimator.start();
Activity切换动画:
@Override//跳转动画
public void startActivity(Intent intent) {
super.startActivity(intent);
////第一个参数是进入第2个Activity(即第二个Activity)的动画,第二个参数是第一个Activity离开时候的动画(即第一个Activity的动画)
overridePendingTransition(R.anim.left_right_in,R.anim.left_right_out);
}
@Override//关闭动画
public void finish() {
super.finish();
overridePendingTransition(R.anim.left_right_in,R.anim.left_right_out);
AppManager.getInstance().removeActivity(this);
}
Fragment切换动画:
/**
* 切换视图
*
* @param fragment
*/
public void switchFragment(Fragment fragment) {
getSupportFragmentManager()
.beginTransaction()
.setCustomAnimations(R.anim.left_right_in,
R.anim.left_right_out)
.replace(R.id.fl_content, fragment).commit();
}
res目录下新建anim目录,新建上面用到的动画xml:
left_right_in.xml:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="300"
android:fromXDelta="-100%"
android:fromYDelta="0"
android:interpolator="@android:anim/decelerate_interpolator"
android:toXDelta="0"
android:toYDelta="0" />
</set>
left_right_out.xml:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="300"
android:fromXDelta="0"
android:fromYDelta="0"
android:interpolator="@android:anim/decelerate_interpolator"
android:toXDelta="100%"
android:toYDelta="0" />
</set>
right_left_in.xml:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<translate
android:duration="300"
android:fromXDelta="100%"
android:fromYDelta="0"
android:interpolator="@android:anim/decelerate_interpolator"
android:toXDelta="0"
android:toYDelta="0" />
</set>
right_left_out.xml:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="300"
android:fromXDelta="0"
android:fromYDelta="0"
android:interpolator="@android:anim/decelerate_interpolator"
android:toXDelta="-100%"
android:toYDelta="0"
/>
</set>
网友评论