コード例 #1
0
 private ShapeHolder createBall(float x, float y) {
   OvalShape circle = new OvalShape();
   circle.resize(BALL_SIZE, BALL_SIZE);
   ShapeDrawable drawable = new ShapeDrawable(circle);
   ShapeHolder shapeHolder = new ShapeHolder(drawable);
   shapeHolder.setX(x);
   shapeHolder.setY(y);
   return shapeHolder;
 }
コード例 #2
0
 @Override
 protected void onDraw(Canvas canvas) {
   for (int i = 0; i < balls.size(); ++i) {
     ShapeHolder shapeHolder = balls.get(i);
     canvas.save();
     canvas.translate(shapeHolder.getX(), shapeHolder.getY());
     shapeHolder.getShape().draw(canvas);
     canvas.restore();
   }
 }
コード例 #3
0
 private void addBall(float x, float y) {
   ShapeHolder shapeHolder = createBall(x, y);
   int red = (int) (100 + Math.random() * 155);
   int green = (int) (100 + Math.random() * 155);
   int blue = (int) (100 + Math.random() * 155);
   int color = 0xff000000 | red << 16 | green << 8 | blue;
   Paint paint = shapeHolder.getShape().getPaint();
   int darkColor = 0xff000000 | red / 4 << 16 | green / 4 << 8 | blue / 4;
   RadialGradient gradient =
       new RadialGradient(37.5f, 12.5f, 50f, color, darkColor, Shader.TileMode.CLAMP);
   paint.setShader(gradient);
   balls.add(shapeHolder);
 }
コード例 #4
0
 private ShapeHolder addBall(float x, float y) {
   OvalShape circle = new OvalShape();
   circle.resize(50f, 50f);
   ShapeDrawable drawable = new ShapeDrawable(circle);
   ShapeHolder shapeHolder = new ShapeHolder(drawable);
   shapeHolder.setX(x - 25f);
   shapeHolder.setY(y - 25f);
   int red = (int) (Math.random() * 255);
   int green = (int) (Math.random() * 255);
   int blue = (int) (Math.random() * 255);
   int color = 0xff000000 | red << 16 | green << 8 | blue;
   Paint paint = drawable.getPaint(); // new Paint(Paint.ANTI_ALIAS_FLAG);
   int darkColor = 0xff000000 | red / 4 << 16 | green / 4 << 8 | blue / 4;
   RadialGradient gradient =
       new RadialGradient(37.5f, 12.5f, 50f, color, darkColor, Shader.TileMode.CLAMP);
   paint.setShader(gradient);
   shapeHolder.setPaint(paint);
   balls.add(shapeHolder);
   return shapeHolder;
 }
コード例 #5
0
 @Override
 protected void onDraw(Canvas canvas) {
   for (ShapeHolder ball : balls) {
     canvas.translate(ball.getX(), ball.getY());
     ball.getShape().draw(canvas);
     canvas.translate(-ball.getX(), -ball.getY());
   }
 }
コード例 #6
0
    @Override
    public boolean onTouchEvent(MotionEvent event) {
      if (event.getAction() != MotionEvent.ACTION_DOWN
          && event.getAction() != MotionEvent.ACTION_MOVE) {
        return false;
      }
      ShapeHolder newBall = addBall(event.getX(), event.getY());

      // Bouncing animation with squash and stretch
      float startY = newBall.getY();
      float endY = getHeight() - 50f;
      float h = (float) getHeight();
      float eventY = event.getY();
      int duration = (int) (500 * ((h - eventY) / h));
      ValueAnimator bounceAnim = ObjectAnimator.ofFloat(newBall, "y", startY, endY);
      bounceAnim.setDuration(duration);
      bounceAnim.setInterpolator(new AccelerateInterpolator());
      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());
      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());
      ValueAnimator stretchAnim1 = ObjectAnimator.ofFloat(newBall, "y", endY, endY + 25f);
      stretchAnim1.setDuration(duration / 4);
      stretchAnim1.setRepeatCount(1);
      stretchAnim1.setInterpolator(new DecelerateInterpolator());
      stretchAnim1.setRepeatMode(ValueAnimator.REVERSE);
      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);
      ValueAnimator bounceBackAnim = ObjectAnimator.ofFloat(newBall, "y", endY, startY);
      bounceBackAnim.setDuration(duration);
      bounceBackAnim.setInterpolator(new DecelerateInterpolator());
      // Sequence the down/squash&stretch/up animations
      AnimatorSet bouncer = new AnimatorSet();
      bouncer.play(bounceAnim).before(squashAnim1);
      bouncer.play(squashAnim1).with(squashAnim2);
      bouncer.play(squashAnim1).with(stretchAnim1);
      bouncer.play(squashAnim1).with(stretchAnim2);
      bouncer.play(bounceBackAnim).after(stretchAnim2);

      // Fading animation - remove the ball when the animation is done
      ValueAnimator fadeAnim = ObjectAnimator.ofFloat(newBall, "alpha", 1f, 0f);
      fadeAnim.setDuration(250);
      fadeAnim.addListener(
          new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
              balls.remove(((ObjectAnimator) animation).getTarget());
            }
          });

      // Sequence the two animations to play one after the other
      AnimatorSet animatorSet = new AnimatorSet();
      animatorSet.play(bouncer).before(fadeAnim);

      // Start the animation
      animatorSet.start();

      return true;
    }
コード例 #7
0
    @Override
    public boolean onTouchEvent(MotionEvent event) {
      if (event.getAction() != MotionEvent.ACTION_DOWN
          && event.getAction() != MotionEvent.ACTION_MOVE) {
        return false;
      }
      ShapeHolder newBall = ShapeHolder.createBall(event.getX(), event.getY());
      balls.add(newBall);

      // 수정 시작해야 하는 부분
      // 공이 늘어났다 찌그러드는 애니메이션 효과
      float startY = newBall.getY();
      float endY = getHeight() - 50f;
      float h = (float) getHeight();
      float eventY = event.getY();
      int duration = (int) (500 * ((h - eventY) / h));

      ValueAnimator bounceAnim = ObjectAnimator.ofFloat(newBall, "y", startY, endY);
      bounceAnim.setDuration(duration);
      bounceAnim.setInterpolator(new AccelerateInterpolator());

      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());

      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());

      ValueAnimator stretchAnim1 = ObjectAnimator.ofFloat(newBall, "y", endY, endY + 25f);
      stretchAnim1.setDuration(duration / 4);
      stretchAnim1.setRepeatCount(1);
      stretchAnim1.setInterpolator(new DecelerateInterpolator());
      stretchAnim1.setRepeatMode(ValueAnimator.REVERSE);

      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);

      startY = endY - (endY - startY) / 2;

      ValueAnimator bounceBackAnim = ObjectAnimator.ofFloat(newBall, "y", endY, startY);
      bounceBackAnim.setDuration(duration);
      bounceBackAnim.setInterpolator(new DecelerateInterpolator());

      ValueAnimator bounceAnim2 = ObjectAnimator.ofFloat(newBall, "y", startY, endY);
      bounceAnim2.setDuration(duration);
      bounceAnim2.setInterpolator(new AccelerateInterpolator());

      ValueAnimator squashAnim21 =
          ObjectAnimator.ofFloat(newBall, "x", newBall.getX(), newBall.getX() - 25f);
      squashAnim21.setDuration(duration / 4);
      squashAnim21.setRepeatCount(1);
      squashAnim21.setRepeatMode(ValueAnimator.REVERSE);
      squashAnim21.setInterpolator(new DecelerateInterpolator());

      ValueAnimator squashAnim22 =
          ObjectAnimator.ofFloat(newBall, "width", newBall.getWidth(), newBall.getWidth() + 50);
      squashAnim22.setDuration(duration / 4);
      squashAnim22.setRepeatCount(1);
      squashAnim22.setRepeatMode(ValueAnimator.REVERSE);
      squashAnim22.setInterpolator(new DecelerateInterpolator());

      ValueAnimator stretchAnim21 = ObjectAnimator.ofFloat(newBall, "y", endY, endY + 25f);
      stretchAnim21.setDuration(duration / 4);
      stretchAnim21.setRepeatCount(1);
      stretchAnim21.setInterpolator(new DecelerateInterpolator());
      stretchAnim21.setRepeatMode(ValueAnimator.REVERSE);

      ValueAnimator stretchAnim22 =
          ObjectAnimator.ofFloat(newBall, "height", newBall.getHeight(), newBall.getHeight() - 25);
      stretchAnim22.setDuration(duration / 4);
      stretchAnim22.setRepeatCount(1);
      stretchAnim22.setInterpolator(new DecelerateInterpolator());
      stretchAnim22.setRepeatMode(ValueAnimator.REVERSE);

      startY = endY - (endY - startY) / 2;

      ValueAnimator bounceBackAnim2 = ObjectAnimator.ofFloat(newBall, "y", endY, startY);
      bounceBackAnim2.setDuration(duration);
      bounceBackAnim2.setInterpolator(new DecelerateInterpolator());

      AnimatorSet bouncer = new AnimatorSet();
      bouncer.play(bounceAnim).before(squashAnim1);
      bouncer.play(squashAnim1).with(squashAnim2);
      bouncer.play(squashAnim1).with(stretchAnim1);
      bouncer.play(squashAnim1).with(stretchAnim2);
      bouncer.play(bounceBackAnim).after(stretchAnim2);
      bouncer.play(bounceAnim2).after(bounceBackAnim);
      bouncer.play(bounceAnim2).before(squashAnim21);
      bouncer.play(squashAnim21).with(squashAnim22);
      bouncer.play(squashAnim21).with(stretchAnim21);
      bouncer.play(squashAnim21).with(stretchAnim22);
      bouncer.play(bounceBackAnim2).after(stretchAnim22);

      // 수정 끝나는 부분

      // 페이딩 애니메이션
      ValueAnimator fadeAnim = ObjectAnimator.ofFloat(newBall, "alpha", 1f, 0f);
      fadeAnim.setDuration(250);
      fadeAnim.addListener(
          new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
              balls.remove(((ObjectAnimator) animation).getTarget());
            }
          });

      // 애니메이션 셋의 애니메이션 셋
      AnimatorSet animatorSet = new AnimatorSet();
      animatorSet.play(bouncer).before(fadeAnim);

      animatorSet.start();

      return true;
    }
コード例 #8
0
    public void onAnimationUpdate(ValueAnimator animation) {

      invalidate();
      ShapeHolder ball = balls.get(0);
      ball.setY((Float) animation.getAnimatedValue());
    }
コード例 #9
0
 private void addBall(float x, float y, int color) {
   ShapeHolder shapeHolder = createBall(x, y);
   shapeHolder.setColor(color);
   balls.add(shapeHolder);
 }