2011-06-02 19 views
3

HI!私は、onDraw()呼び出しで画像を塗り潰したい、水平スクロールビューの中にあるsurfaceViewを持っています。しかし、何も描かれていない。 私は、図面がスレッド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); 

私はまた、私は運なしでコールsetWillNotDraw(偽)を追加しようとしていsynchronized (_surfaceHolder) { _panel.postInvalidate(); }

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

を変更しようとしました:

@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

+1

はい、アニメーションが必要なときにスレッドを開始します。私はこれがスクロールビューで動作するかどうかはわかりませんが、SurfaceViewが唯一のビューである場合はうまく動作します。 ScrollViewは、スクロールするときにそのビューを再描画しています。そのビューはSurfaceView図面と干渉する可能性があります。そのため、実験が必要です。 – Lumis

+1

あなたが正しいと思ったのは、私が面倒を見せていたのが水平スクロールビューでした。 Lumisありがとう! – kakka47

関連する問題