在位图中绘图有时会搞砸

时间:2014-02-22 12:52:44

标签: java android canvas bitmap

我有一个绘制mandelbrot图像的android。

我有16个线程,每个线程绘制图像的1/16部分,它们有自己的位图。

    for(int x=0;x<xw;x++) {
        for(int y=0;y<yh;y++) {
            c_real=realMin+((double)(x+x1)*scaleReal);
            c_imag=imagMin+((double)(y+y1)*scaleImag);
            tmp=cal_pixel(c_real, c_imag, mag);
            while(pause[thread]) {
                try{
                    Thread.sleep(5);
                }catch(InterruptedException ie){

                }
            }
            plot(x,y,c[tmp], thread);
            active[thread]=true;
        }
        dirty=true;
    }

public void plot(int x, int y, int c, int myId) {
    bitmap[myId].setPixel(x, y, c);
}

每件的运行方法

public void run() {
    int myId=id++;
    Log.i("run","Starting thread "+myId);
    while(true) {
        if (redraw[myId]) {
            Log.i("run","redraw");
            calc(myId);
            redraw[myId]=false;
        }
        try{
            Thread.sleep(100);
        }catch(InterruptedException ie) {
        }
    }
}

我有一个单独的线程,每秒10次获取位图并在画布上绘制它们。

        image.pause(true);
        for(int i=0;i<16;i++) {
            c.drawBitmap(image.getBitmap(i), (i%4)*w/4, (i/4)*h/4, null);
        }
        image.pause(false);

这是绘制它们的线程

public void run() {
    Canvas c;
    while (true) {
        if (run) {
            if (view.dirty()) {
                c = null;
                try {
                    c = holder.lockCanvas(null);
                    synchronized (holder) {
                        view.onDraw(c);
                    }
                } finally {
                    // do this in a finally so that if an exception is thrown
                    // during the above, we don't leave the Surface in an
                    // inconsistent state
                    if (c != null) {
                        holder.unlockCanvasAndPost(c);
                    }
                }
            }
            try{
                Thread.sleep(100);
            }catch(InterruptedException ie){

            }
        }else{
            //Log.i("Waiting the night away","Waiting the night away");
            try{
                Thread.sleep(1000);
            }catch(InterruptedException ie){

            }
        }
    }
}

有时候这些作品中的一个或几个被搞砸了,并没有画到画布上,不知道为什么会发生这种情况。

它在android 2.3.x中工作得更好它几乎从未发生过,但是现在在android 4.x中它经常发生qquite,如果你想检查程序并体验这里的bug就是链接https://play.google.com/store/apps/details?id=se.klockar.mandelbrotmobile < / p>

0 个答案:

没有答案