最近在学习android的开发,打算把sdk的示例代码研究一下,一直以来都没有作笔记的习惯,以致于看过的东西记住的少遗忘的多,所以试试记下笔记,以备之后查询。java
-----------------------------以上是首博呢喃------------------------------------------------------android
BouncingBalls主要使用的是ValueAnimator及其子类ObjectAnimatoride
首先是采用了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叠加来完成this
//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回弹完成以后,有一个逐渐消失的过程动画lua
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()); } });