2015-09-05 115 views
0

我只是想畫一個SurfaceView,並從here繪圖畫布SurfaceView

修改了一些示例代碼,如果我在它的工作循環直接繪製,但是當我調用Draw方法這是行不通的。任何想法可能是什麼問題? 但是,這是我在其他教程中看到的,所以它應該工作。 當然我可以使用draw1。但我想知道爲什麼onDraw在這裏不起作用?

public class TestSurefaceView extends Activity { 
MySurfaceView mySurfaceView; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    mySurfaceView = new MySurfaceView(this); 
    setContentView(mySurfaceView); 
} 
class MySurfaceView extends SurfaceView implements Runnable{ 
    Thread thread = null; 
    SurfaceHolder surfaceHolder; 
    volatile boolean running = false; 
    private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); 
    Random random; 
    public MySurfaceView(Context context) { 
     super(context); 
     surfaceHolder = getHolder(); 
     random = new Random(); 
    } 
    @Override 
    public void run() { 
     while(running){ 
      if(surfaceHolder.getSurface().isValid()){ 
       Canvas canvas = surfaceHolder.lockCanvas(); 
       //draw(canvas); // does not work 
       draw1(canvas); // works 
       surfaceHolder.unlockCanvasAndPost(canvas); 
      } 
     } 
    } 
    private void draw1(Canvas canvas){ 
     paint.setStyle(Paint.Style.STROKE); 
     paint.setStrokeWidth(3); 
     int w = canvas.getWidth();int h = canvas.getHeight(); 
     int x = random.nextInt(w-1); 
     int y = random.nextInt(h-1); 
     int r = random.nextInt(255); 
     int g = random.nextInt(255); 
     int b = random.nextInt(255); 
     paint.setColor(0xff000000 + (r << 16) + (g << 8) + b); 
     canvas.drawPoint(x, y, paint); 
    } 
    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
     draw1(canvas); 
    } 
} 
} 
+0

你錯過了你的'setWillNotDraw(false);'調用某處...... – EpicPandaForce

回答

0

SurfaceViews有兩部分,Surface和View。 onDraw()用於在視圖上繪圖。 Surface的要點是它是一個獨立的層,位於視圖UI層下方,因此您可以在不影響通常的View無效/重繪循環的情況下對其進行繪製。

很難說,爲什麼當你沒有解釋它沒有發生時它「不起作用」。定義onDraw()方法時的一個常見問題是,如果View UI得到無效,它將調用該方法在View上繪製。因爲視圖位於曲面的頂部,所以在視圖上繪製的任何東西都會遮擋曲面,例如,一個不透明的背景將防止任何發生在表面上的可見。

我通常建議您不要繼承SurfaceView,因爲這樣做沒有價值,而且良好的面向對象操作鼓勵組合繼承。