36 votes

La méthode onDraw () étendue de SurfaceView n'a jamais été appelée

J'essaie de modifier le SurfaceView que j'utilise pour faire un aperçu de la caméra afin d'afficher un carré de superposition. Cependant, la méthode onDraw de SurfaceView étendu n'est jamais appelée.

Voici la source:

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


}
 

80voto

Gab Royer Points 4209

Trouvé sur le groupe Google Android développeurs. Vous devez simplement ajouter:

 setWillNotDraw(false)
 

Au constructeur. Maintenant, si quelqu'un pouvait m'expliquer pourquoi, ce serait grandement apprécié.

25voto

dreambig Points 151

Correction mineure:

L'ajout de setWillNotDraw (false) au constructeur entraînera des plantages, car l'objet Surface sous-jacent n'est pas encore créé.

Au lieu de cela, placez l'instruction setWillNotDraw (false) dans la méthode surfaceCreated (). Cela retarde l'appel jusqu'à ce qu'il y ait un objet réel à utiliser et qu'il fonctionne correctement.

(et un grand merci aux utilisateurs qui ont posté cette solution, cela a résolu un problème majeur pour moi)

7voto

Heliodor Points 480

Romain Guy l'a expliqué:

"Par souci d'efficacité, les modèles ne font pas appel à leur méthode onDraw (). Pour l'activer, appelez setWillNotDrawEnabled (false) (ou définissez l'attribut XML équivalent sur false."

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X