Есть ли лучший способ сделать перетаскиваемый фон? - PullRequest
0 голосов
/ 16 августа 2011

Я начинаю новый проект, и до сих пор я создал простое приложение с изображением, нарисованным на Canvas, которое вы можете перетаскивать по экрану пальцем. Идея состоит в том, чтобы нарисовать множество вещей на этом Canvas для игры. Однако перетаскивание является чрезвычайно медленным, при перетаскивании пальцем экран обновляет изображение, возможно, 2-3 раза в секунду. Это очень заметно медленно, поэтому я предполагаю, что я делаю это очень неправильно (я на Nexus S).

У меня есть только очень скелеты приложения, только SurfaceView, содержащий поток для обновления Canvas этим одним изображением. Вот код:

// In GameThread

private void doDraw(Canvas c) {
    if(canvasInit){
        Bitmap background = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.bg);
        c.drawBitmap(background, offsetX, offsetY, null);           
    }
}


public boolean doTouchDown(MotionEvent event) {
    if(drag == false){
        //initialize drag
        startX = event.getX();
        startY = event.getY();
        drag = true;
    }else{
        //caluclate new position
        offsetX = Math.max(Math.min(0, offsetX + (event.getX() - startX)), mCanvasWidth - BACKGROUND_WIDTH); 
        offsetY = Math.max(Math.min(0, offsetY + (event.getY() - startY)), mCanvasHeight- BACKGROUND_HEIGHT);
        startX = event.getX();
        startY = event.getY();
    }
    return true;
}

public boolean doTouchUp(MotionEvent event){
    drag = false;
    return true;
}

Ответы [ 2 ]

1 голос
/ 16 августа 2011

Я думаю, что проблема в методе doDraw, вы создаете новое растровое изображение каждые Draw, попробуйте загрузить этот Bitmap в Constructor, затем получить его ссылку в методе doDraw и нарисовать его, используя х и у.

1 голос
/ 16 августа 2011

Кажется, вы загружаете растровое изображение каждый раз, когда рисуете.Вы можете попробовать перенести загрузку ресурса в какой-нибудь метод инициализации / конструктор SurfaceView и сравнить производительность?

Bitmap background;
...

private void init() {
  ...
  background = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.bg);
  ...
}

private void doDraw(Canvas c) {
    if(canvasInit){
        c.drawBitmap(background, offsetX, offsetY, null);           
    }
}
...