/** * 左右の端に移動します。 * * @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; }