private void startExplosion() {
   if (selectionAnimation.isActive()) {
     selectionAnimation.stop();
   }
   explosionAnimation.setSpeed(dataHolder.getConfiguration().isFastAnimation());
   explosionAnimation.init(SystemClock.elapsedRealtime());
   invalidate();
 }
  @Override
  protected void onDraw(Canvas canvas) {
    // drawField(canvas);
    drawBackGroud(canvas);

    if (moveAnimation.isActive()) {
      moveAnimation.draw(canvas);
    } else if (explosionAnimation.isActive()) {
      explosionAnimation.draw(canvas);
    } else {
      selectionAnimation.draw(canvas);
    }

    if (selectionAnimation.isActive()
        || moveAnimation.isActive()
        || explosionAnimation.isActive()) {
      invalidate();
    }
    updateAnimationObjects();
    if (false) {
      drawStatistic(canvas);
    }
  }
  @Override
  public boolean onTouchEvent(MotionEvent event) {
    if (moveAnimation.isActive() || explosionAnimation.isActive()) {
      return true;
    }
    if (event.getAction() != MotionEvent.ACTION_UP) {
      return true; // super.onTouchEvent(event);
    }
    int x = Math.round((event.getX() - dataHolder.getCellSize() / 2) / dataHolder.getCellSize());
    int y = Math.round((event.getY() - dataHolder.getCellSize() / 2) / dataHolder.getCellSize());
    if (x < 0
        || x >= dataHolder.getGameEngine().getGameField().getSizeX()
        || y < 0
        || y >= dataHolder.getGameEngine().getGameField().getSizeY()) {
      return super.onTouchEvent(event);
    } else {
      TouchResult results = dataHolder.getGameEngine().touchAction(x, y);
      switch (results) {
        case explode:
          startExplosion();
          break;

        case selected:
          startSelection();
          break;

        case no_action:
          if (selectionAnimation.isActive()) {
            selectionAnimation.stop();
            invalidate();
          }
          if (moveAnimation.isActive()) {
            moveAnimation.stop();
            invalidate();
          }
          break;
        default:
          break;
      }
    }
    return true;
  }
 private void updateAnimationObjects() {
   selectionAnimation.update(SystemClock.elapsedRealtime());
   moveAnimation.update(SystemClock.elapsedRealtime());
   explosionAnimation.update(SystemClock.elapsedRealtime());
 }