Поворот изображения без сокращения на Android
Мне нужно создать компас в приложении, над которым я работаю. Поэтому я попытался создать новое представление под названием CompassView, которое в основном расширяет изображение, показывает растровое изображение с восточным востоком на север к югу, указывающее на него, использует датчики, чтобы найти градусы, на которые указывает телефон, и соответственно поворачивать изображение таким образом, чтобы оно создавало фактический компас. Но проблема в том, что если я попытаюсь повернуть изображение на некоторые углы, например, на 45 градусов, он сжимается. Вот несколько изображений, чтобы объяснить это лучше.
![This is normal]()
![This is shrinked]()
Как вы можете видеть, второе изображение сжимается, когда я пытаюсь повернуть около 45. Что я хочу, чтобы это сделать:
![this]()
Вот код, который я использую в настоящее время:
Bitmap bMap = BitmapFactory.decodeResource(getResources(),
R.drawable.compass);
Matrix xMatrix = new Matrix();
xMatrix.reset();
xMatrix.postRotate(360-mValue, 75, 75); //This is 75 because 150 is the image width
Bitmap bMapRotate = Bitmap.createBitmap(bMap, 0, 0,
bMap.getWidth(), bMap.getHeight(), xMatrix, true);
setImageBitmap(bMapRotate);
Любая помощь будет оценена по достоинству. БЛАГОДАРЯ
РЕДАКТИРОВАТЬ: (РЕШЕНИЕ)
Я, наконец, получил работу благодаря принятому ответу. Вот код, который я использую для тех, кто хочет знать, как это работает:
RotateAnimation rAnimAntiClockWise = new RotateAnimation(
360 - mValue, 360 - event.values[0],
Animation.RELATIVE_TO_SELF, 0.5f,
Animation.RELATIVE_TO_SELF, 0.5f);
//mValue is the angle in degrees and i subtracted it from 360 to make it anticlockwise, and event.values[0] is the same thing as mValue
rAnimAntiClockWise.setFillAfter(true);
rAnimAntiClockWise.setInterpolator(new LinearInterpolator());
rAnimAntiClockWise.setDuration(0);
startAnimation(rAnimAntiClockWise);
Ответы
Ответ 1
Вы можете использовать альтернативный трюк, который будет работать так же, как вращать и не изменять размер изображения. Я фактически поворачиваю изображение с углом 45 градусов и сохраняю изменения после анимации.
rAnimAntiClockWise = new RotateAnimation(0.0f, 45.0f,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
0.5f);
rAnimAntiClockWise.setFillAfter(true);
rAnimAntiClockWise.setInterpolator(new LinearInterpolator());
bitmap = BitmapFactory.decodeResource(getResources(),
R.drawable.rotate);
rAnimAntiClockWise.setDuration(100);
img_rotate.startAnimation(rAnimAntiClockWise);
Ответ 2
Проблема в том, что ваше новое изображение на самом деле больше, из-за того, что углы источника "торчат", и поэтому представление уменьшает его до соответствия.
Несколько возможных подходов:
-
После вышеуказанного кода вызовите Bitmap.createBitmap(Bitmap source, int x, int y, int width, int height)
, скопировав центральную область нужного размера. Легко получить код, который у вас есть, но создает бесполезное промежуточное растровое изображение.
-
Вместо того, чтобы передавать преобразование и исходное изображение в createBitmap, просто создайте измененное растровое изображение правильного размера, оберните его в холст и скажите Canvas визуализировать повернутое изображение.
bMapRotate = Bitmap.createBitmap(
bMap.getWidth(), bMap.getHeight(), bMap.getConfig());
Canvas canvasRotate = new Canvas(bMap);
canvasRotate.drawBitmap(bMap, xMatrix, paint); // any opaque Paint should do
-
Сохраните код, который у вас есть, но скажите, чтобы представление обрезало, а не масштабировалось при рендеринге.