Android SDK示例代码学习(1)----BouncingBalls

最近在学习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());
   }
});



你可能感兴趣的:(BouncingBalls,ValueAnimator)