Поворот изображения без сжатия на Android - PullRequest
10 голосов
/ 02 апреля 2012

Мне нужно создать компас в приложении, над которым я работаю.Поэтому я попытался создать новый вид под названием 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);

Ответы [ 2 ]

4 голосов
/ 02 апреля 2012

Вы можете использовать альтернативный трюк, который будет работать так же, как поворот, и не изменяет размер изображения.Я на самом деле поворачиваю изображение под углом 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);
3 голосов
/ 02 апреля 2012

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

Несколько возможных подходов:

  1. После вышеприведенного кода наберите Bitmap.createBitmap(Bitmap source, int x, int y, int width, int height), скопировав центральную область правильного размера. Легко, если у вас есть код, но создает бесполезную промежуточную битовую карту.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...