Рисование растрового изображения происходит медленно при масштабировании до высокого разрешения - PullRequest
2 голосов
/ 02 февраля 2012

У меня очень простая задача - нарисовать фоновое изображение в пользовательском представлении.Я создаю растровое изображение и масштабирую его, чтобы соответствовать ширине и высоте представления.Это делает приложение более медленным, примерно вдвое быстрее (я печатаю значение времени каждые 10 миллисекунд для измерения скорости работы).Это код:

public class GView extends View {

int w, h;
Bitmap bg;
int time = 0;

boolean created = false;
public GView(Context context) {
    super(context);
    bg = BitmapFactory.decodeResource(getResources(), R.drawable.my_image);
    new Timer();
}

@Override
public void onDraw(Canvas c) {
    Paint p = new Paint();
    if(!created) {
        w=getWidth();
        h=getHeight();
        p.setColor(Color.RED);
        p.setTextSize(40);
        bg = Bitmap.createScaledBitmap(bg, w, h, false);
        created = true;
    }
    if(created) {
        time++;
        c.drawBitmap(bg, 0,0,null);
        c.drawText(time+"", (int)(w/4),  (int)(h/4), p);
    }

}

class Timer extends Handler {
    private Timer() {
        handleMessage(obtainMessage(0));
    }

    @Override
    public void handleMessage(Message m) {
        invalidate();
        sendMessageDelayed(obtainMessage(0), 10);
    }
}

}

К вашему сведению, исходное изображение 300x225.Разрешение экрана моего планшета, на которое я масштабирую изображение, составляет 1280x800.Дело в том, что если я масштабирую фоновое изображение, например, (int) (. 8 * w), (int) (. 8 * h) или уменьшаем или вообще не масштабирую изображение, то оно работает быстро, как и ожидалось.

Я пытался использовать ImageView и использовать setImageResource (R.drawable.my_image), но это было так же медленно.Я думал, что рисование изображения, чтобы соответствовать фону, должно быть очень простым для любых языков программирования, но у меня была эта проблема очень долго, даже после долгих поисков.Я надеюсь, что кто-нибудь может дать мне правильный ответ.Я был бы очень признателен за это.

1 Ответ

1 голос
/ 08 февраля 2012

createScaledBitmap () не следует делать внутри подпрограммы onDraw (). Это довольно медленно, потому что он использует процедуру усреднения пикселей, чтобы «сгладить» растянутое растровое изображение. Создайте растянутое растровое изображение вне потока графического интерфейса, а затем просто нарисуйте его (canvas.drawBitmap) в своем методе onDraw (). Параметр фильтра может использоваться для создания масштабирования «ближайшего соседа», если установлено значение false. Это будет выглядеть «блочно», но обработка будет намного быстрее.

public static Bitmap createScaledBitmap
  (Bitmap src, int dstWidth, int dstHeight, boolean filter)
...