Me gustaría abrir un SurfaceView
con un icono colocado en el centro de la pantalla cuando se inicia una aplicación por primera vez. Estoy evocando la creación de iconos usando una implementación de SurfaceHolder.Callback
para rastrear cuando el objeto 'Lienzo' está listo. Mi pregunta es, ¿hay una mejor manera? ¿Existen métodos menos engorrosos para iniciar un SurfaceView
con algunos Drawables
cargados en la creación sin tener que recurrir a la colocación de la lógica de extracción dentro de un objeto de devolución de llamada?Inicializando SurfaceView con un Drawable
Aquí está mi código de referencia. En primer lugar el objeto que no dibujo:
public class CanvasDraw{
protected final SurfaceHolder mHolder;
protected final Drawable mDrawable;
public interface DrawLogic{
void draw(Rect _surface);
}
public CanvasDraw(SurfaceView _view, Drawable _drawable){
mHolder = _view.getHolder();
mDrawable = _drawable;
}
public void draw(DrawLogic _logic){
Canvas canvas = null;
try{
canvas = mHolder.lockCanvas();
if(canvas != null){
Log.i("DRAWABLE", "Drawing " + mDrawable.toString());
_logic.draw(mHolder.getSurfaceFrame());
mDrawable.draw(canvas);
}
else{
Log.i("DRAWABLE", "Canvas null valued");
}
}
finally{
if(canvas != null){
mHolder.unlockCanvasAndPost(canvas);
}
}
}
}
y luego mi objeto de devolución de llamada privada:
private class DrawOnceCallback implements SurfaceHolder.Callback {
private final SurfaceHolder mHolder;
public DrawOnceCallback(SurfaceHolder _holder){
mHolder = _holder;
mHolder.addCallback(this);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}
@Override
public void surfaceCreated(SurfaceHolder holder) {
Log.i("SURFACEHOLDER","Surface created. Canvas available.");
mDrawTiles.draw(new CanvasDraw.DrawLogic(){
@Override
public void draw(Rect _surface) {
mTiles.setBounds(
_surface.centerX() - mDrawWidth/2,
_surface.centerY() - mDrawHeight/2,
_surface.centerX() + mDrawHeight/2,
_surface.centerY() + mDrawHeight/2);
}
});
mHolder.removeCallback(this);
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {Log.i("SURFACEHOLDER","Surface destroyed.");}
}
Estoy teniendo muchos problemas con SurfaceView. No puedo terminar la actividad de SurfaceView como finish() mehtod. Estoy recibiendo OutOfMemoryException cuando abro decir 13 SufraceView ... ooohh Estoy en problemas. ¿sabes cómo terminarlos? Estoy ampliando mi clase con SurfaceView. –