是否有更好的方法来制作可拖动的背景?

时间:2011-08-15 20:50:06

标签: android performance surfaceview

我正在开始一个新项目,到目前为止,我已经创建了一个简单的应用程序,其中有一个图像被绘制到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 个答案:

答案 0 :(得分:1)

每次绘图时,您似乎都在加载Bitmap。您可以尝试将资源加载移动到某种初始化方法/ 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);           
    }
}

答案 1 :(得分:1)

我认为问题出在doDraw方法中,您每Draw创建一个新的位图,尝试在Bitmap中加载此Constructor,然后在{{{}}中获取它1}}方法,并使用你的x和y绘制它。