2011-05-12 51 views
1

我試圖創建隨機像素顏色的15fps「位圖視頻」。以下代碼正確顯示一個位圖,但不會使用新的隨機圖像更新/刷新圖像。任何人都可以請幫我弄清楚爲什麼?Android:使用新數據刷新位圖

public class ViewThread extends Thread { 
    private SurfaceHolder mHolder; 
    private Panel mPanel; 
    private boolean mRun = false; 

    public ViewThread(Panel panel) { 
     mPanel = panel; 
     mHolder = mPanel.getHolder(); 
    } 

    public void setRunning(boolean run) { 
     mRun = run; 
    } 

    @Override 
    public void run() { 
     Canvas canvas = null; 
     while (mRun) { 
      canvas = mHolder.lockCanvas(); 
      if (canvas != null) { 
       mPanel.doDraw(canvas); 
       mHolder.unlockCanvasAndPost(canvas); 
      } 
     } 
    } 
} 

public class Panel extends SurfaceView implements SurfaceHolder.Callback { 
    private ViewThread mThread; 
    private Bitmap mBitmap; 
    private int[] mcolors; 

    public Panel(Context context) { 
     super(context); 
     init(); 
    } 

    private void init() { 
     getHolder().addCallback(this); 
     mThread = new ViewThread(this); 

     // create a graphic 
     mcolors = colorMap(); 
     int[] colors = mcolors; 
     mBitmap = Bitmap.createBitmap(colors, 64, 64, Bitmap.Config.ARGB_8888); 
     mBitmap = Bitmap.createScaledBitmap(mBitmap, 256, 256, false); 
    } 

    protected void doDraw(Canvas canvas) { 
     canvas.drawColor(Color.BLACK); 
     canvas.drawBitmap(mBitmap, 8, 8, null); 
    } 

    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 
    } 

    //@Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     if (!mThread.isAlive()) { 
      mThread = new ViewThread(this); 
      mThread.setRunning(true); 
      mThread.start(); 
     } 
    } 

    public void surfaceDestroyed(SurfaceHolder holder) { 
     if (mThread.isAlive()) { 
      mThread.setRunning(false); 
     } 
    } 
} 

private static int[] colorMap() { 

    int[] ltable = { 0xff000000, 0xff00000f, 0xff00001e, 0xff00002d, 0xff00003c, 0xff00004b, 
        0xff00005a, 0xff000069, 0xff000078, 0xff000087, 0xff000096, 0xff0000a5, 
        0xff0000b4, 0xff0000c3, 0xff0000d2, 0xff0000e1, 0xff0000f0, 0xff0000ff, 
        0xff0f00ff, 0xff1e00ff, 0xff2d00ff, 0xff3c00ff, 0xff4b00ff, 0xff5a00ff, 
        0xff6900ff, 0xff7800ff, 0xff8700ff, 0xff9600ff, 0xffa500ff, 0xffb400ff, 
        0xffc300ff, 0xffd200ff, 0xffe100ff, 0xfff000ff, 0xffff00ff, 0xffff00f0, 
        0xffff00e1, 0xffff00d2, 0xffff00c3, 0xffff00b4, 0xffff00a5, 0xffff0096, 
        0xffff0087, 0xffff0078, 0xffff0069, 0xffff005a, 0xffff004b, 0xffff003c, 
        0xffff002d, 0xffff001e, 0xffff000f, 0xffff0000 }; 

    int[] mcolors = new int[4096]; 
    Random rand = new Random(); 

    for(int i=0; i < 4096; i++) 
    { 
     int num = rand.nextInt(52); 
     mcolors[i] = ltable[num]; 
    } 

    return mcolors; 
} 

}

+0

我錯過了什麼,還是你在你的'init'方法創建一個隨機的位圖只有一次一次'創建Panel'? – harism 2011-05-12 19:52:41

回答

0

在我看來,你在呼喚你的線程only once when surfaceCreated()被調用。之後,你的線程再也不會被調用。我相信你需要類似timer and reinitiate thread or call thread run() method to display another image

[編輯]

一些其他的東西

1)重新畫布持有人在每個while循環。

while (run) { 
     c = null; 
     try { 
      c = panel.getHolder().lockCanvas(); 

2)此外,機器人1.5後surfaceview不能每秒刷新更40-45時間,以便嘗試減少FPS至30,看看它是否有什麼差別。

例子:http://www.anddev.org/android-2d-3d-graphics-opengl-problems-f55/surfaceview-portage-1-5-other-version-of-android-t15675.html

+0

這是我的理解,你不能重新啓動一個線程,而不創建它的另一個實例。我想讓線程運行並不斷將更新的位圖推送到畫布。我只是不確定如何完成。 – user750956 2011-05-12 20:09:30

+0

把你的線程放在while()循環中的sleep(xxx)裏面,看看是否有任何區別。 – Priyank 2011-05-12 20:15:23

+0

我編輯我的答案根據新的調查結果。 – Priyank 2011-05-12 20:22:33