在Android中使用画布绘制位图时闪烁

时间:2012-03-21 12:52:35

标签: android android-canvas

我正在尝试根据位图做一个菜单。菜单本身应该可以通过screentouch移动事件移动,基本上我想在视图上拖动按钮。该按钮还包括碰撞检测,因此无论何时触摸它们都会相互反弹。

但是在绘制我的位图时遇到了一些问题。目前我正在使用矩形来缩放我的位图以适应我的设备窗口。想要我想要的,目前无法获得我的位图更平滑的动作而不会闪烁。是开启gl的唯一选择吗?或者我错过了我的代码中的一些重要内容?

这是在我的surfaceview中绘制每个按钮,其中MenuButton是保存位图的类,并根据触摸和拖动移动更新其位置。

protected void onDraw(Canvas canvas) {
    canvas.drawColor(Color.WHITE);

    for(MenuButton menuButton : menuButtonSprites) {
        menuButton.onDraw(canvas);
    }
}

我希望位图缩放到每个设备的宽度,为此我使用矩形来适应位图。

public MenuButton(MenuView v, Bitmap bmp, int yPosition){
    this.menuView = v;
    this.menuButton = bmp;
    this.xMax = v.getWidth();
    this.yPosistion = yPosition;
    menuButtonRectangle = new Rect(xMin, this.yPosistion-yMin, xMax, this.yPosistion+yMax);
}

public void update(int y){
    if(menuButtonPressed)
    {
        this.yPosistion = y;
        menuButtonRectangle.set(xMin, yPosistion-yMin, xMax, yPosistion+yMax);
    }
}

public void onDraw(Canvas canvas){
    canvas.drawBitmap(menuButton, null, menuButtonRectangle, null);
}

我还有一个更新绘图的线程

public void run() {
    long ticksPS = 1000 / FPS;
    long startTime;
    long sleepTime;
    Canvas c = null;

    while (running) {
        startTime = System.currentTimeMillis();
        try {
            c = view.getHolder().lockCanvas();
            synchronized (view.getHolder()) {
                view.onDraw(c);
            }
        } 
        finally {
            if (c != null) {
                view.getHolder().unlockCanvasAndPost(c);
            }
        }

        sleepTime = ticksPS - (System.currentTimeMillis() - startTime);
        try {
            if (sleepTime > 0)
                sleep(sleepTime);
            else
                sleep(10);
        } 
        catch (Exception e) {
        }
    }
}

我真的不知道我做错了什么以及为什么我无法让按钮顺利移动。这是使用画布的缺点还是我错过了一些非常重要的东西:D?

1 个答案:

答案 0 :(得分:0)

通常在绘画时存在同步问题时会出现此问题。这可能是由于较高的帧速率或者也可能是较低的帧速率。这些问题可以通过双缓冲或调整帧速率来修复。

双缓冲意味着,我们将创建一个屏幕大小的空位图并获取图形对象,而不是将图像直接绘制到主画布上。将所有内容绘制到位图上,然后直接将此位图绘制到主画布。