Android: проблема производительности canvas.drawBitmap
Недавно у меня возникла проблема с Android: поворот изображения вокруг центра, который был решен с помощью Unconn.
Однако оказывается, что решение - как и оно работает - имеет гораздо худшую производительность, чем материал RotateAnimation.
Что у меня есть до сих пор: 1) FrameLayout с двумя ImageViews, расположенными друг над другом 2) SensorEventHandler, который перемещает нижнее представление в соответствии с измеренным курсом. Это работает приемлемо, если я использую RotateAnimation
Я хотел ускорить его и немного сгладить анимацию, но потерпел неудачу. Вот текущее решение: 1) SurfaceView с отдельным потоком, управляющий отрисовкой слоев 2) Без выполнения приведенного ниже кода поток может достигать около 50 кадров в секунду. 3) С кодом ниже частота кадров снижается до 5ps и меньше, так что это уже не очень плавно...
Вот код:
mRadar: растровое изображение, показывающее "радар", загруженный из ресурсов ранее. 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 ответ
Это очень быстро:
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... какое изображение вы используете для этого спрайта?