Поверните представление макета Android вокруг его центра, используя сенсорный прослушиватель

Вот как моя настройка для поворота выглядит.

Введите описание изображения здесь

Я слушаю действие вниз и перемещаюсь по значку поворота, пытаясь рассчитать угол поворота и применяя этот угол поворота ко всей компоновке, инкапсулируя edittext. Приложенное вращение должно быть около центра инкапсуляции относительной компоновки.

Вот как я пытаюсь добиться этого, в значке touchListener для вращения.

if(v == ivRotateSticker){ //TODO grab xc and yc using (top and bottom)/2 and (left and right)/2 to grab center of sticker after each rotation final float x = event.getX(); final float y = event.getY(); rlTextStickerLayout.getGlobalVisibleRect(myViewRect); xc = myViewRect.width()/2; yc = myViewRect.height()/2; dx = scaleReceiver.getWidth() - myViewRect.width(); dy = scaleReceiver.getHeight() - myViewRect.height(); leftBound = scaleReceiver.getX(); topBound = scaleReceiver.getY(); switch (event.getAction()){ case MotionEvent.ACTION_DOWN: mViewAngle = rlTextStickerLayout.getRotation(); mPrevAngle = Math.toDegrees(Math.atan2(x - xc, yc - y)); break; case MotionEvent.ACTION_MOVE: Log.d("EventRegistered", " " + event.getRawX() + "--" + dx + " -- " + dy); mCurrAngle = Math.toDegrees(Math.atan2(x - xc, yc - y)); if (x >= leftBound && y >= topBound && x <= dx && y <= dy) { float rot = (float) (mViewAngle + mCurrAngle - mPrevAngle); rlTextStickerLayout.setRotation((float) (mViewAngle + mCurrAngle - mPrevAngle)); Log.d("stickerRotation"," "+rot); } break; } return true; } 

Но результирующее вращение является глючным и не столь желанным гладким. Кроме того, если я перемещаю стикер в другое место, как мне обновить новый центр для вращения, так как вращение после перемещения наклейки резко изменяет центр вращения. Как я могу добиться гораздо более плавного вращения?

Solutions Collecting From Web of "Поверните представление макета Android вокруг его центра, используя сенсорный прослушиватель"