最近在学习android的开发,打算把sdk的示例代码研究一下,一直以来都没有做笔记的习惯,以至于看过的东西记住的少遗忘的多,因此试试记下笔记,以备以后查询。
-----------------------------以上是首博呢喃------------------------------------------------------
BouncingBalls主要使用的是ValueAnimator及其子类ObjectAnimator
首先是采用了ValueAnimator及其子类ObjectAnimator来设置背景颜色渐变的动画效果
//创建一个值渐变动画,其中backgroundColor是View中的属性,即View类中有setBackgroundColor方法
ValueAnimator colorAnim = ObjectAnimator.ofInt(this, "backgroundColor", RED, BLUE);
colorAnim.setDuration(3000);
colorAnim.setEvaluator(new ArgbEvaluator());//设置颜色插值器
colorAnim.setRepeatCount(ValueAnimator.INFINITE);
colorAnim.setRepeatMode(ValueAnimator.REVERSE);
colorAnim.start();
自定义了ShapHolder类保存用于绘制ball的属性
public class ShapeHolder {
private float x = 0, y = 0;//ball的中心点坐标
private ShapeDrawable shape;//ball的图形
private int color;
private RadialGradient gradient;//ball的环形渲染器,没有用到,渲染器已经设置到paint里边了
private float alpha = 1f;
private Paint paint;
.....
}
ball的动画效果通过一组ValueAnimator叠加来完成
//ball加速下落,还没有碰到下边框的动画
ValueAnimator bounceAnim = ObjectAnimator.ofFloat(newBall, "y", startY, endY);
bounceAnim.setDuration(duration);
bounceAnim.setInterpolator(new AccelerateInterpolator());//设置加速
//ball碰到下边框后压扁的效果,宽度拉长一倍,所以中心点要相应调整
ValueAnimator squashAnim1 = ObjectAnimator.ofFloat(newBall, "x", newBall.getX(),
newBall.getX() - 25f);
squashAnim1.setDuration(duration/4);
squashAnim1.setRepeatCount(1);//压扁和回弹是逆向过程,所以这里需要重复一次
squashAnim1.setRepeatMode(ValueAnimator.REVERSE);//设置重复的那次动画是逆向过程
squashAnim1.setInterpolator(new DecelerateInterpolator());//设置减速
//ball碰到下边框后压扁的效果,宽度拉长一倍
ValueAnimator squashAnim2 = ObjectAnimator.ofFloat(newBall, "width", newBall.getWidth(),
newBall.getWidth() + 50);
squashAnim2.setDuration(duration/4);
squashAnim2.setRepeatCount(1);
squashAnim2.setRepeatMode(ValueAnimator.REVERSE);
squashAnim2.setInterpolator(new DecelerateInterpolator());
//ball碰到下边框后压扁的效果,高度变为原来的一半,中心点相应调整
ValueAnimator stretchAnim1 = ObjectAnimator.ofFloat(newBall, "y", endY,
endY + 25f);
stretchAnim1.setDuration(duration/4);
stretchAnim1.setRepeatCount(1);
stretchAnim1.setInterpolator(new DecelerateInterpolator());
stretchAnim1.setRepeatMode(ValueAnimator.REVERSE);
//ball碰到下边框后压扁的效果,高度变为原来的一半
ValueAnimator stretchAnim2 = ObjectAnimator.ofFloat(newBall, "height",
newBall.getHeight(), newBall.getHeight() - 25);
stretchAnim2.setDuration(duration/4);
stretchAnim2.setRepeatCount(1);
stretchAnim2.setInterpolator(new DecelerateInterpolator());
stretchAnim2.setRepeatMode(ValueAnimator.REVERSE);
//ball回弹的效果
ValueAnimator bounceBackAnim = ObjectAnimator.ofFloat(newBall, "y", endY,
startY);
bounceBackAnim.setDuration(duration);
bounceBackAnim.setInterpolator(new DecelerateInterpolator());
ball回弹完成之后,有一个逐渐消失的过程动画
ValueAnimator fadeAnim = ObjectAnimator.ofFloat(newBall, "alpha", 1f, 0f);
fadeAnim.setDuration(250);
fadeAnim.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
//消失动画完成后删除ball
balls.remove(((ObjectAnimator)animation).getTarget());
}
});