Метод onDraw () расширенного SurfaceView никогда не вызывал

Я пытаюсь изменить SurfaceView, который я использую для предварительного просмотра камеры, чтобы отобразить перекрывающий квадрат. Однако метод onDraw расширенного SurfaceView никогда не вызывается.

Вот источник:

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 "Метод onDraw () расширенного SurfaceView никогда не вызывал"

Нашел его в группе разработчиков Google Android. Вам просто нужно добавить:

 setWillNotDraw(false) 

К конструктору. Теперь, если кто-то может объяснить мне, почему, это было бы очень полезно.

Незначительная коррекция:

Добавление setWillNotDraw (false) к конструктору приведет к сбоям, поскольку основной объект Surface еще не создан.

Вместо этого поставьте оператор setWillNotDraw (false) в метод surfaceCreated (). Это задерживает вызов до тех пор, пока не будет реальный объект для работы и будет работать правильно.

(И большое спасибо пользователям, которые разместили это решение, он решил для меня серьезную проблему)

Ромен Гай объяснил это:

«Для эффективности макеты не вызывают метод onDraw (). Чтобы включить его, вызовите setWillNotDrawEnabled (false) (или установите эквивалентный атрибут XML равным false)."

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

Основываясь на всех вышеприведенных комментариях, я использовал:

Добавьте setWillNotDraw (false) в событие onAttachedToWindow ().

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

И это сработало.