Поверните представление макета 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; } 

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

  1. Вращение вида для анимации до заданных значений (90, 180, 270) в 1000 мс:

    . View.animate () вращение (90f) .setDuration (1000) .start (); . View.animate () вращение (180f) .setDuration (1000) .start (); . View.animate () вращение (270F) .setDuration (1000) .start ();

  2. Используя эту библиотеку, вы можете повернуть всю иерархию представлений https://github.com/rongi/rotate-layout