2011-06-02 77 views
3

嗨!我有一個水平滾動視圖內的surfaceView,我想用onDraw()調用填充圖像。但是,沒有任何東西。 我有一個類,其中繪製是從線程CanvasThread完成的。OnDraw()沒有被觸發,沒有任何東西在SurfaceView中繪製 - Android

public class PanelChart extends SurfaceView implements SurfaceHolder.Callback { 
private CanvasThread canvasthread ; 
public PanelChart(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    // TODO Auto-generated constructor stub 
getHolder().addCallback(this); 
canvasthread = new CanvasThread(getHolder(), this); 
setFocusable(true); 

我試圖改變

`synchronized (_surfaceHolder) { 
         _panel.postInvalidate(); 
        }` 

synchronized (_surfaceHolder) { _panel.postInvalidate(); }

我也試過沒有運氣添加通話setWillNotDraw(假):

@Override 
public void surfaceCreated(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 
    canvasthread.setRunning(true); 
    canvasthread.start(); 
    setWillNotDraw(false); 

這似乎是一個共同的問題,但我沒有提出任何解決方案橫跨爲我工作。

謝謝!

回答

3

postInvalidate不會使用surfaceView調用onDraw。您需要解鎖畫布,繪製東西然後鎖定畫布。下面是一個surfaceView的線程的例子:

class CanvasThread extends Thread { 
     private SurfaceHolder surfaceHolder; 
     private PanelChart panel; 
     private boolean run = false; 

     public CanvasThread(SurfaceHolder surfaceHolder, PanelChart panel) { 
      this.surfaceHolder = surfaceHolder; 
      this.panel = panel; 
     } 

     public void setRunning(boolean run) { 
      this.run = run; 
     } 

     public SurfaceHolder getSurfaceHolder() { 
      return surfaceHolder; 
     } 

     @Override 
     public void run() { 
      Canvas c; 
      while (run) { 
       c = null; 

       //limit the frame rate to maximum 60 frames per second (16 miliseconds) 
       timeNow = System.currentTimeMillis(); 
       timeDelta = timeNow - timePrevFrame; 
       if (timeDelta < 16){ 
        try{ 
         Thread.sleep(16 - timeDelta); 
        }catch(InterruptedException e){ 

        } 
       } 
       timePrevFrame = System.currentTimeMillis(); 

       try { 
        c = surfaceHolder.lockCanvas(null); 
        synchronized (surfaceHolder) { 
         panel.onDraw(c); //draw canvas 
         computePhysics(); //calculate next frame 
        } 
       } finally { 
        if (c != null) { 
         surfaceHolder.unlockCanvasAndPost(c); //show canvas 
        } 
       }//try finally 
       } //while 
     }//run 
    }//thread 
+0

謝謝,但這也行不通。你的意思是關鍵是啓動線程,它調用OnDraw,然後睡覺線程,然後解鎖它?所以問題應該在線程中? – kakka47 2011-06-03 04:56:58

+1

是的,當你需要動畫時啓動線程。我不確定這是否可以在滾動視圖中工作,但是當SurfaceView是唯一的視圖時,它可以很好地工作。當您滾動ScrollView時,它會重新繪製其視圖,這可能會干擾SurfaceView繪圖...因此您需要進行試驗。 – Lumis 2011-06-03 11:42:15

+1

你說得對,這是我放置了內部表面視圖的水平滾動視圖,正在與我混淆。謝謝盧米斯! – kakka47 2011-06-03 22:18:21