Поворот изображения без сокращения на 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
    
  • Сохраните код, который у вас есть, но скажите, чтобы представление обрезало, а не масштабировалось при рендеринге.