Android: вращение изображения вокруг центра - PullRequest
4 голосов
/ 03 марта 2011

Я пытаюсь повернуть изображение вокруг центра. Обычно это работает с использованием RotateAnimation, но я хочу сделать это немного быстрее. Сейчас я использую шаблон SurfaceView с отдельной нитью для рисования.

Это код, который правильно отображает растровое изображение (в зависимости от внешнего "заголовка")

курс = угол в градусах, битмап = битмап, w = ширина растрового изображения, h = высота растрового изображения.

    Matrix m = new Matrix();
    m.preRotate(heading, w/2, h/2);
    m.setTranslate(50,50);

    canvas.drawBitmap(bitmap, m, null);

Недостаток: изображение представляет собой круг, а приведенный выше код создает видимые эффекты наложения ...

Приведенный ниже код также поворачивает изображение, но при вращении (скажем, от 0 до 45 градусов по часовой стрелке) центр нового изображения перемещается вниз / вправо. Полагаю, эксцентрический эффект обусловлен увеличенной шириной / высотой нового изображения. Однако этот код не создает псевдонимов, если установлен фильтр = true. Есть ли способ использовать код № 1, но иметь своего рода сглаживание или использовать код № 2, но избавиться от движения центра?

    Matrix m = new Matrix();
    m.preRotate(heading, w/2, h/2);
    m.setTranslate(50,50);

    Bitmap rbmp = Bitmap.createBitmap(bitmap, 0, 0, w, h, m, true);
    canvas.drawBitmap(rbmp, 50, 50, null);

ОБНОВЛЕНИЕ: В результате обсуждения в этой теме правильная версия кода # 2 (сглаживание и правильное вращение) будет выглядеть следующим образом (смещение 50,50 опущено):

        Matrix m = new Matrix();

        m.setRotate(heading, w/2, h/2);
        Bitmap rbpm = Bitmap.createBitmap(bitmap, 0, 0, w, h, m, true);
        canvas.drawBitmap(rbpm, (w - rbpm.getWidth())/2, (h - rbpm.getHeight())/2, null);

Спасибо.

1 Ответ

1 голос
/ 03 марта 2011

Найдите центр исходного изображения и для нового изображения и центр, используя это:

Matrix minMatrix = new Matrix();
//height and width are set earlier.
Bitmap minBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas minCanvas = new Canvas(minBitmap);

int minwidth = bitmapMin.getWidth();  
int minheight = bitmapMin.getHeight();
int centrex = minwidth/2;
int centrey = minheight/2;

minMatrix.setRotate(mindegrees, centrex, centrey);
Bitmap newmin = Bitmap.createBitmap(minBitmap, 0, 0, (int) minwidth, (int) minheight, minMatrix, true);

minCanvas.drawBitmap(newmin, (centrex - newmin.getWidth()/2), (centrey - newmin.getHeight()/2), null);
minCanvas.setBitmap(minBitmap);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...