/**
  * 左右の端に移動します。
  *
  * @param withAnimation アニメーションを行う場合はtrue.行わない場合はfalse
  */
 private void moveToEdge(boolean withAnimation) {
   // TODO:縦軸の速度も考慮して斜めに行くようにする
   // X・Y座標と移動方向を設定
   final int currentX = getXByTouch();
   final int currentY = getYByTouch();
   final int goalPositionX;
   // 画面端に移動する場合は画面端の座標を設定
   if (mMoveDirection == FloatingViewManager.MOVE_DIRECTION_DEFAULT) {
     final boolean isMoveRightEdge = currentX > (mMetrics.widthPixels - getWidth()) / 2;
     goalPositionX = isMoveRightEdge ? mPositionLimitRect.right : mPositionLimitRect.left;
   }
   // 左端への移動
   else if (mMoveDirection == FloatingViewManager.MOVE_DIRECTION_LEFT) {
     goalPositionX = mPositionLimitRect.left;
   }
   // 右端への移動
   else if (mMoveDirection == FloatingViewManager.MOVE_DIRECTION_RIGHT) {
     goalPositionX = mPositionLimitRect.right;
   }
   // 画面端に移動しない場合は、現在の座標のまま
   else {
     goalPositionX = currentX;
   }
   // TODO:Y座標もアニメーションさせる
   final int goalPositionY = currentY;
   // 指定座標に移動
   moveTo(currentX, currentY, goalPositionX, goalPositionY, withAnimation);
 }
 /** 初回描画時の座標設定を行います。 */
 @Override
 public boolean onPreDraw() {
   getViewTreeObserver().removeOnPreDrawListener(this);
   // 画面端に移動しない場合は指定座標に移動
   if (mMoveDirection == FloatingViewManager.MOVE_DIRECTION_NONE) {
     mParams.x = mInitX;
     mParams.y = mInitY;
     moveTo(mInitX, mInitY, mInitX, mInitY, false);
   } else {
     mParams.x = 0;
     mParams.y = mMetrics.heightPixels - mStatusBarHeight - getMeasuredHeight();
     moveToEdge(false);
   }
   mIsDraggable = true;
   mWindowManager.updateViewLayout(this, mParams);
   return true;
 }