如何在Android中的画布上绘制相邻的位图?

时间:2013-12-22 01:10:27

标签: java android bitmap android-canvas

我花了一整夜的时间试图找出为什么我无法使用Android完全相邻的两个位图(两者之间没有间隙)。

对于上下文,我正在构建一个频谱图应用程序,它为每个进入的音频数据“窗口”显示一个垂直位图,为用户提供频率热图。目前我正在使用预先录制的音频,因此我可以在显示任何内容之前执行所有计算 - 我有一个整数数组的ArrayList,每个数组代表一个窗口的位图,使用计时器绘制到画布上线程。

我知道当应用程序试图超越屏幕的尺寸时,下面的方法最终会中断,但我现在并不担心。我想解决的问题是下面的代码导致绘制的位图之间有一个像素(ish)的间隙,当我真的希望它们绝对相邻时。

这是我的计时器线程的run()方法:

    public void run() {
        Canvas c = null;
        try {
            c = sh.lockCanvas(null);
            synchronized(sh) {
                doDraw(c);
            }
        } finally {
            if (c!=null) {
                sh.unlockCanvasAndPost(c);
            }
        }
    }

这是绘制位图的doDraw()方法,然后跳到绘制的位图的末尾以绘制下一个位图。它只是通过递增'windowsDrawn'字段来实现:

    private void doDraw(Canvas canvas) {
        canvas.drawBitmap(spec.getBitmapWindow(windowsDrawn), 0, 1, windowsDrawn, 0, 1, h, false, null);
        System.out.println("Windows drawn: "+windowsDrawn);
        windowsDrawn++;
    }

spec.getBitmapWindow(windowsDrawn)只返回要绘制的垂直窗口的整数像素值数组。

Here's a screenshot to show what I'm talking about.图像看起来好像是在小监狱的后面,我想摆脱这些。

谢谢!

1 个答案:

答案 0 :(得分:0)

我发现了我做错了什么。 “监狱酒吧”效应实际上是我对后备缓冲区进行增量更新的副作用,后者可能每隔一段时间就会被翻转(因此会丢失一些我对其他缓冲区的更新,给出黑色垂直线)。通过确保我正在写入缓冲区位图然后每次重绘整个帧来解决问题。 Android中不允许对屏幕进行增量更新(就像我试图做的那样)。