Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Android中将相邻位图绘制到画布?_Java_Android_Bitmap_Android Canvas - Fatal编程技术网

Java 如何在Android中将相邻位图绘制到画布?

Java 如何在Android中将相邻位图绘制到画布?,java,android,bitmap,android-canvas,Java,Android,Bitmap,Android Canvas,我花了一整晚的时间试图弄明白为什么我不能用Android绘制一系列彼此完全相邻(中间没有间隙)的位图 在上下文中,我正在构建一个频谱图应用程序,它为每个进入的音频数据“窗口”显示一个垂直位图,为用户提供频率热图。目前,我正在使用预录制的音频,以便在显示任何内容之前执行所有计算-我有一个整数数组的ArrayList,每个数组表示一个窗口的位图,该位图使用计时器线程绘制到画布上 我知道,当应用程序试图画出屏幕的尺寸时,下面的方法最终会失败,但我现在不担心这一点。我想解决的问题是,下面的代码会导致绘制

我花了一整晚的时间试图弄明白为什么我不能用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()方法,它绘制位图,然后跳到绘制的位图的末尾,以便绘制下一个位图。它只是通过增加“WindowsDrawed”字段来实现:

    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(WindowsDrawed)
只需为要绘制的垂直窗口返回像素值的整数数组

这张照片看起来像是在小小的监狱里,我想把这些都扔掉


谢谢

我发现我做错了什么。“监狱栏”效应实际上是我向后台缓冲区写入增量更新的副作用,据推测,后台缓冲区每隔一段时间就会被翻转一次(因此,我的一些更新会丢失到另一个缓冲区,并显示黑色竖线)。通过确保我改为写入缓冲区位图,然后每次重新绘制整个帧,问题得到了解决。Android中不允许对屏幕进行增量更新(就像我试图做的那样)