扩展的SurfaceView的onDraw()方法从不调用

我正在尝试修改我用于进行相机预览的SurfaceView,以便显示覆盖的正方形。 但是,扩展SurfaceView的onDraw方法永远不会被调用。

这里是来源:

public class CameraPreviewView extends SurfaceView { protected final Paint rectanglePaint = new Paint(); public CameraPreviewView(Context context, AttributeSet attrs) { super(context, attrs); rectanglePaint.setARGB(255, 200, 0, 0); rectanglePaint.setStyle(Paint.Style.FILL); rectanglePaint.setStrokeWidth(2); } @Override protected void onDraw(Canvas canvas){ canvas.drawRect(new Rect(10,10,200,200), rectanglePaint); Log.w(this.getClass().getName(), "On Draw Called"); } } public class CameraPreview extends Activity implements SurfaceHolder.Callback{ private SurfaceHolder holder; private Camera camera; @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); // We remove the status bar, title bar and make the application fullscreen requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); // We set the content view to be the layout we made setContentView(R.layout.camera_preview); // We register the activity to handle the callbacks of the SurfaceView CameraPreviewView surfaceView = (CameraPreviewView) findViewById(R.id.camera_surface); holder = surfaceView.getHolder(); holder.addCallback(this); holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { Camera.Parameters params = camera.getParameters(); params.setPreviewSize(width, height); camera.setParameters(params); try { camera.setPreviewDisplay(holder); } catch (IOException e) { e.printStackTrace(); } camera.startPreview(); } public void surfaceCreated(SurfaceHolder holder) { camera = Camera.open(); } public void surfaceDestroyed(SurfaceHolder holder) { camera.stopPreview(); camera.release(); } } 

Solutions Collecting From Web of "扩展的SurfaceView的onDraw()方法从不调用"

在Android开发人员的Google小组上find它。 你只需要添加:

 setWillNotDraw(false) 

给构造函数。 现在如果有人能解释我为什么,那将不胜感激。

小修改:

将setWillNotDraw(false)添加到构造函数将导致崩溃,因为底层Surface对象尚未创build。

相反,将setWillNotDraw(false)语句放在surfaceCreated()方法中。 这延迟了通话,直到有一个真正的对象使用,并正常工作。

(非常感谢发布此解决scheme的用户,这为我解决了一个主要问题)

罗曼·盖伊解释说:

“为了提高效率,布局不会调用onDraw()方法,要调用setWillNotDrawEnabled(false)(或者将等价的XML属性设置为false)。

请参阅: http : //groups.google.com/group/android-developers/browse_thread/thread/a0b71c59fb33b94a?fwc=1&pli=1

根据以上所有评论我使用:

在onAttachedToWindow()事件中添加setWillNotDraw(false)。

@Override protected void onAttachedToWindow() { super.onAttachedToWindow(); setWillNotDraw(false); }

它的工作。