what studio makeroid example android

android - studio - El método extendido de OnView() de SurfaceView nunca se llama



surfaceholder android studio (4)

Corrección menor:

Agregar setWillNotDraw (false) al constructor causará bloqueos, porque el objeto Surface subyacente aún no se ha creado.

En su lugar, coloque la sentencia setWillNotDraw (false) en el método surfaceCreated (). Esto demora la llamada hasta que haya un objeto real para trabajar y funcione correctamente.

(y muchas gracias a los usuarios que publicaron esta solución, resolvió un gran problema para mí)

Estoy tratando de modificar el SurfaceView que uso para hacer una vista previa de la cámara para mostrar un recuadro superpuesto. Sin embargo, el método onDraw del SurfaceView extendido nunca se llama.

Aquí está la fuente:

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(); } }


En base a todos los comentarios anteriores, utilicé:

Agregue setWillNotDraw (false) en el evento onAttachedToWindow ().

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

Y funcionó.


Lo encontré en el grupo de Google android-developers. Simplemente tiene que agregar:

setWillNotDraw(false)

Para el constructor Ahora si alguien pudiera explicarme por qué, sería muy apreciado.


Romain Guy lo explained :

Para mayor eficiencia, los diseños no reciben su método onDraw() . Para habilitarlo, llame a setWillNotDrawEnabled(false) (o establezca el atributo XML equivalente a falso).