[英]Extended SurfaceView's onDraw() method never called
我正在嘗試修改用於進行相機預覽的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();
}
}
在android-developers Google網上論壇上找到了它。 您只需添加:
setWillNotDraw(false)
給構造函數。 現在,如果有人可以解釋我的原因,將不勝感激。
小修正:
將setWillNotDraw(false)添加到構造函數將導致崩潰,因為尚未創建基礎Surface對象。
而是將setWillNotDraw(false)語句放入surfaceCreated()方法中。 這會延遲通話,直到有一個真正的對象可以使用並正常工作為止。
(非常感謝發布此解決方案的用戶,它為我解決了一個主要問題)
羅曼·蓋伊(Romain Guy) 解釋說:
為了提高效率,布局不調用其
onDraw()
方法。 要啟用它,請調用setWillNotDrawEnabled(false)
(或將等效的XML屬性設置為false。)
基於以上所有評論,我使用了:
在onAttachedToWindow()事件中添加setWillNotDraw(false)。
@Override protected void onAttachedToWindow() { super.onAttachedToWindow(); setWillNotDraw(false); }
而且有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.