2013-03-05 42 views
0

我有這個類,它擴展View爲什麼canvas.setBitmap()在Parent中隱藏其他視圖?

public class DrawingPanel extends View { 

    private Bitmap toDisk; 
    private int w; 
    private int h; 

    public DrawingPanel(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     System.out.println("Drawing"); 
     p0 = new Paint(); 
     p0.setStyle(Style.STROKE); 

    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 

     ... 
    } 

    @Override 
    protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
     this.w = w; 
     this.h = h; 
     toDisk = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); 
     super.onSizeChanged(w, h, oldw, oldh); 
    } 

    @Override 
    public void onDraw(Canvas canvas) { 

     canvas.drawColor(Color.WHITE); 
     canvas.drawPath(path0, p0); 
     canvas.setBitmap(toDisk); 

    } 

} 

我使用這個類作爲一個佈局的子視圖。在Eclipse的Graphical view中,所有東西都可以,並且所有視圖都可見,但在模擬器中,我的類(DrawingPanel)隱藏了低於它的其他視圖。當我刪除此行時:

canvas.setBitmap(toDisk); 

所有視圖都將再次可見。而另一個奇怪的事情:當我把那條線在onDraw方法是這樣的第一行:

@Override 
    public void onDraw(Canvas canvas) { 
       canvas.setBitmap(toDisk); 
     canvas.drawColor(Color.WHITE); 
     canvas.drawPath(path0, p0); 
    } 

是它下面我DrawingPanel和其他意見將是不可見的。我怎麼解決這個問題? 我的目的是保存用戶在畫布上繪製的內容。

回答

3

您誤解了setBitmap。它爲你設置一個位圖發送新的繪圖命令到屏幕的INSTEAD。它不會將以前的命令繪製到位圖上。要做到這一點,你需要這樣做:

Canvas diskCanvas = new Canvas(toDisk); 
//Send all draw commands to this canvas 
screenCanvas.drawBitmap(toDisk, new Matrix(), new Paint()); 

請注意,這隻會將位圖保存到內存。要保存到磁盤,您需要將其保存到文件中。不要在onDraw中這樣做,這是一個緩慢的操作。

相關問題