android平台的动画以android 3.0作为一个分界点,在3.0之前android提供了Tween Animation和Drawable Animation;动画效果也比较简单,只有简单缩放、平移、旋转和更改透明度;这两种只作用于view,归为View Animation。在android3.0提供了属性动画,为了兼容android3.0以下的动画开发可以使用一个叫NineOldanimiations的库
一、View Animation
对应的view子类有TranslateAnimation、ScaleAnimation、AlphaAnimation和RotateAnimation; View Animation应用有着较大的局限性,作用在view对象上面而不改变view对象本身,简单来说只是改变了view的绘制,例如一个Button的坐标为(0,0),使用tweenAnimation使它移动了(dx,dy),但是你在原先的button的位置点击仍然会出发button的点击事件。可以使用在res/anim/文件夹下创建动画的xml文件,然后使用AnimationUtils.loadAnimation(context, R.anim.test);导入动画的xml文件示例如下
<?xmlversion="1.0"encoding="utf-8"?>
<alphaxmlns:android="http://schemas.android.com/apk/res/android"
android:duration="500"
android:fromAlpha="0.0"
android:interpolator="@android:anim/accelerate_interpolator"
android:toAlpha="1.0"/>
<translate
android:duration="300"
android:fromXDelta="100.0%p"
android:toXDelta="0.0"/>
<scale
android:duration="@android:integer/config_shortAnimTime"
android:fromXScale="1.0"
android:fromYScale="1.0"
android:pivotX="50%"
android:pivotY="0%"
android:toXScale="0.3"
android:toYScale="0.3"/>
帧动画是顺序播放一组预先定义好的图片,对应的类有animationDrawable,AnimationDrawable使用xml文件来定义,文件路径在drawble文件夹中
<?xmlversion="1.0"encoding="utf-8"?>
<animation-listxmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<item
android:drawable="@drawable/first"
android:duration="500"/>
<item
android:drawable="@drawable/second"
android:duration="500"/>
<item
android:drawable="@drawable/third"
android:duration="500"/>
<item
android:drawable="@drawable/forth"
android:duration="500"/>
</animation-list>
在代码中使用可以跟设置view的背景图一样设置
view.setBackgroudResource(R.drawable.animationdrawable);
二、属性动画
下面使用ObjectAnimator和ValueAnimator实现简单的动画效果
private void translationX() {
ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, screenWidth - iv_ball.getWidth());
valueAnimator.setTarget(iv_ball);
valueAnimator.setDuration(5000).start();
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
iv_ball.setTranslationX((float) valueAnimator.getAnimatedValue());
}
}
});
}
private void translationY() {
ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, screenHeight - iv_ball.getHeight());
valueAnimator.setTarget(iv_ball);
valueAnimator.setDuration(5000).start();
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
iv_ball.setTranslationY((float) valueAnimator.getAnimatedValue());
iv_ball.setAlpha((float)valueAnimator.getAnimatedValue());
}
}
});
}
private void parabola() {
ValueAnimator valueAnimator = new ValueAnimator();
valueAnimator.setDuration(10000);
valueAnimator.setObjectValues(new PointF(0, 0));
valueAnimator.setInterpolator(new LinearInterpolator());
valueAnimator.setEvaluator(new TypeEvaluator<PointF>() {
@Override
public PointF evaluate(float v, PointF start, PointF end) {
PointF p = new PointF();
p.x = 200 * v * 3;
p.y = 0.5f * 200 * (v * 3) * (v * 3);
return p;
}
});
valueAnimator.start();
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
PointF p = (PointF)valueAnimator.getAnimatedValue();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
iv_ball.setX(p.x);
iv_ball.setY(p.y);
}
}
});
}
private void parabolaRotate() {
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(iv_ball, "alpha", 0.5f);
ValueAnimator valueAnimator = new ValueAnimator();
valueAnimator.setObjectValues(new PointF(0, 0));
valueAnimator.setEvaluator(new TypeEvaluator<PointF>() {
@Override
public PointF evaluate(float v, PointF start, PointF end) {
PointF p = new PointF();
p.x = 200 * v * 3;
p.y = 0.5f * 200 * (v * 3) * (v * 3);
return p;
}
});
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
PointF p = (PointF) valueAnimator.getAnimatedValue();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
iv_ball.setX(p.x);
iv_ball.setY(p.y);
}
}
});
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.setDuration(10000);
animatorSet.setInterpolator(new LinearInterpolator());
animatorSet.playTogether(objectAnimator, valueAnimator);
animatorSet.start();
}