Foros       Consigue tu camiseta aquí
Como actualizar ImageView

 
Publicar Nuevo Tema   Responder al Tema    Índice del Foro www.Android-Spa.com -> Problemas programando en Android
Mostrar mensajes anteriores:   

Urizen

Mensajes: 46
MensajePublicado: Jue Jul 29, 2010 1:35 pm    Título del mensaje: Como actualizar ImageView Enviar mensaje privado Responder citando

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

Mensajes: 46
MensajePublicado: Jue Jul 29, 2010 1:52 pm    Título del mensaje: Enviar mensaje privado Responder citando

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().

Publicar Nuevo Tema   Responder al Tema    Índice del Foro www.Android-Spa.com -> Problemas programando en Android Todas las horas están en GMT + 2 Horas
Página 1 de 1
Ver tema anterior :: Ver siguiente tema  

 
Saltar a:  
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas