2010-07-27 50 views
3

我已將子視圖SurfaceView並在Activity的onCreate中實例化它。生成預覽,但控件永遠不會進入在SurfaceView的子類中重寫的onDraw()。這是爲什麼?子類化SurfaceView並重寫onDraw()以更改SurfaceView參數以生成所需大小的預覽

class ActivityClass extends Activity{ 

    onCreate(){ 

     mPreview = new Preview(this); 
     setContentView(mPreview); 
    } 
    public void startPreview(){ 

     rec = new MediaRecorder(); 
     rec.setVideoSource();....... 
     rec.setPreviewDisplay(mPreview.getSurfaceHolder.getSurface()); 
    } 
} 

class Preview extends SurfaceView implements SurfaceHolder.Callback{ 

    SurfaceHolder mHolder; 

    public Preview(Context context){ 
     super(context); 
     mHolder = getHolder();  
     mHolder.addCallback(this);  
     mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
     bringToFront();//this is not 
     invalidate();//making a difference 
    } 

    SurfaceHolder getSurfaceHolder(){ 

     return mHolder; 
    } 
    //Surface callback methods implemented here 
} 

在Surface上繪製預覽之前,不應該將控件賦予onDraw回調函數嗎?

因爲onDraw回調對Android框架說'你不畫視圖。自從我實施以來,我將繪製它「。我對嗎?

爲什麼然後,控件無法進入onDraw()?請幫忙。

回答

0
public class SelectedRect extends View { 
    public SelectedRect(Context context) { 
     super(context);  
     bringToFront(); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
     drawLine(canvas); 
     invalidate();  
     this.bringToFront();  
    } 
} 

而且在活動類:

View rect = new SelectedRect(this); 
rect.bringToFront(); 
this.addView(rect, new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, 
     LayoutParams.FILL_PARENT)); 
+0

我無法進行建議的更改,因爲我的程序如上所述。請指教 – Namratha 2010-07-27 08:56:13

+0

我做了建議的更改 - 我擴展視圖,而不是SurfaceView,但在Activity中的onCreate()中,我無法使用foll語句: this.addView(rect,new LinearLayout.LayoutParams(LayoutParams。 FILL_PARENT,LayoutParams.FILL_PARENT)); 錯誤:未定義類型爲myActivity的方法addView(View,LinearLayout.LayoutParams)。 請幫忙。 – Namratha 2010-07-28 04:58:08

0

有鬼是怎麼回事。看起來你試圖將SurfaceView設置爲預覽顯示。在這種情況下,Activity應該實現SurfaceHolder.Callback(而不是SurfaceView)。這樣Activity就可以知道SurfaceView何時被創建並準備好繪製。此外,甚至不需要擴展SurfaceView:您應該可以使用SurfaceView本身。

假設我誤解了,你真的想擴展surfaceview由於某種原因... 我沒有看到你在你的預覽類中覆蓋onDraw的位置。你沒有包含這個代碼嗎?

當你說onDraw回調告訴android'你不繪製視圖。自從我執行以來,我會畫出它',我不同意。 onDraw是一個View,它可以繪製所有視圖都有的東西,比如背景。 SurfaceView擴展視圖。當你擴展SurfaceView時,你可以重寫onDraw來告訴android除了在視圖中繪製的原始onDraw之外還繪製東西。換句話說,Android總是完成所有繪圖;覆蓋onDraw只是告訴它在繪製時間的時候繪製更多的東西。

3

您只需添加

setWillNotDraw(false) 

給構造函數。

其完成.. :)