Urizen 
|
Publicado: Jue Jul 29, 2010 1:35 pm Título del mensaje: Como actualizar ImageView |
|
|
Hola a todos,
Estoy intentando dibujar el flujo de vídeo de la cámara transformado a escala blanco y negro (no en grises) en un ImageView propio, pero no consigo que pinte más de una vez. Pondría la mano en el fuego a que lo estoy haciendo mal, pues nunca he tenido que pintar sobre un ImageView propio utilizando el método onDraw. Viendo las trazas he visto que sólo entra, en efecto, una sola vez al método. Adjunto el código a ver si alguien me puede echar un cable.
Activity
| Código : | import android.app.Activity;import android.os.Bundle;import android.view.KeyEvent;public class BaW extends Activity { private BWImageView mImageView; private BWCamera mCamera; /** Called when the activity is first created. */ @Override public void onCreate (Bundle savedInstanceState ) { super. onCreate(savedInstanceState ); setContentView (R. layout. main); mImageView = (BWImageView )findViewById (R. id. surface); mImageView. init(); mCamera = new BWCamera (320, 240, mImageView ); } @Override protected void onResume () { mCamera. init(); super. onResume(); } @Override protected void onPause () { mCamera. close(); super. onPause(); } @Override public boolean onKeyDown (int keyCode, KeyEvent event ) { if(keyCode == KeyEvent. KEYCODE_BACK) { mCamera. close(); return true; } return super. onKeyDown(keyCode, event ); }} |
Camara
| Código : | import android.hardware.Camera;import android.hardware.Camera.PreviewCallback;import android.util.Log;public class BWCamera implements PreviewCallback { private Camera mCamera; private int wnd_width, wnd_height; private BWImageView mImageView; public BWCamera (int wnd_width, int wnd_height, BWImageView mImageView ) { this. wnd_width = wnd_width; this. wnd_height = wnd_height; this. mImageView = mImageView; } public void init () { synchronized(this) { mCamera = Camera. open(); Camera. Parameters p = mCamera. getParameters(); p. setPreviewSize(wnd_width, wnd_height ); mCamera. setParameters(p ); mCamera. startPreview(); mCamera. setPreviewCallback(this); } } public void close () { synchronized(this) { try { if (mCamera!= null) { mCamera. stopPreview(); mCamera. release(); } } catch (Exception e ) { Log. e("Camera", e. getMessage()); } } } public void onPreviewFrame (byte[] yuv, Camera cam ) { if(mCamera == null) return; synchronized(this) { short [][] data = new short[wnd_width ][wnd_height ]; for(int y= 0; y< wnd_height; y++ ) { for(int x= 0; x< wnd_width; x++ ) { int a = wnd_height*y + x; if(yuv [a ] >= 20) data [x ][y ] = 0; else data [x ][y ] = 1; } } mImageView. setDatos(data ); } }} |
ImageView
| Código : | import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.util.AttributeSet;import android.util.Log;import android.widget.ImageView;public class BWImageView extends ImageView { private short [][] datos; private int ancho, alto; public BWImageView (Context context ) { super(context ); } public BWImageView (Context context, AttributeSet attrs ) { super(context, attrs ); } public BWImageView (Context context, AttributeSet attrs, int defStyle ) { super(context, attrs, defStyle ); } public void init () { datos = null; ancho = 320; alto = 240; } public void setDatos (short[][] datos ) { this. datos = datos; } @Override protected void onDraw (Canvas canvas ) { Log. i("BW", "En onDraw"); if(datos == null) return; Log. i("BW", "A pintar"); for(float y= 0; y< alto; y++ ) { for(float x= 0; x< ancho; x++ ) { int color = (datos [(int)x ][(int)y ] == 0) ? Color. BLACK : Color. WHITE; Paint punto = new Paint(); punto. setARGB(0, color, color, color ); canvas. drawPoint(x, y, punto ); } } Log. i("BW", "Pintado"); datos = null; super. onDraw(canvas ); }} |
Gracias de antemano. |
|
Urizen 
|
Publicado: Jue Jul 29, 2010 1:52 pm Título del mensaje: |
|
|
| Viendo un poco la documentación he encontrado, al menos, la forma de obligar al ImageView a que invoque el método onDraw(); para ello sólo hace falta invocar al método invalidate(). |
|
|
No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|