Android: проблема производительности canvas.drawBitmap - PullRequest
1 голос
/ 03 марта 2011

У меня возникла проблема в последнее время Android: поворот изображения вокруг центра , который был решен с помощью Unconn.

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

Что у меня есть на данный момент: 1) FrameLayout с двумя ImageViews, расположенными друг над другом 2) SensorEventHandler, который перемещает нижнее представлениевокруг в соответствии с измеренным курсом.Это работает приемлемо, если я использую RotateAnimation

. Я хотел ускорить его и немного сгладить анимацию, но потерпел неудачу.Вот текущее решение: 1) SurfaceView с отдельным потоком, управляющий отрисовкой слоев 2) Без выполнения приведенного ниже кода поток может достигать около 50 кадров в секунду.3) При показанном ниже коде частота кадров снижается до 5ps и менее, так что это больше не является чем-то очень плавным ...

Вот код:

mRadar: Растровое изображение, показывающее "radar ", загружено из ресурса ранее. mHeading: текущий курс, взятый с датчиков в градусах. mRadarW, mRadarH: начальная ширина / высота изображения, определенная при создании.

        Matrix m = new Matrix();
        m.setRotate(mHeading, mRadarW/2, mRadarH/2);
        Bitmap rotated_radar = Bitmap.createBitmap(mRadar, 0, 0, mRadarW, mRadarH, m, true);
        canvas.drawBitmap(rotated_radar, (mRadarW - rotated_radar.getWidth())/2, (mRadarH - rotated_radar.getHeight())/2, null);
        canvas.drawBitmap(mRadar, 0, 0, null);

Является ли материал Matrix / drawBitmap, известныйвыполнять не так хорошо, на самом деле хуже, чем RotateAnimation?Если нет возможности использовать это: Какие варианты вы могли бы предложить?Хотя RotateAnimation сейчас будет работать, мне нужно будет составить гораздо более сложное изображение, за до Мне нужно будет перейти на RotateAnimation, поэтому, боюсь, я снова проиграю с drawBitmap и друзьями ...

О, я скучаю по CALayers:)

1 Ответ

2 голосов
/ 04 марта 2011

Это очень быстро:

canvas.save(); //save the position of the canvas
canvas.rotate(angle, X + (ballW / 2), Y + (ballH / 2)); //rotate the canvas
canvas.drawBitmap(ball, X, Y, null); //draw the ball on the rotated canvas
canvas.restore(); //"rotate" the canvas back so that it looks like the ball has rotated   

Я использую хорошее 32-битное изображение в формате png, поэтому мне не нужен фильтр или сглаживание Paint ... какое изображение вы используетедля этого спрайта?

...