2012-06-07 18 views
8

Tengo un problema "simple". Intento dibujar en Surfaceview. Disposición en XML:Dibujo de Android en SurfaceView y Canvas

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:keepScreenOn="true" 
    android:orientation="vertical" > 

    <TextView 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="@string/hello" /> 

    <SurfaceView 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/imagesurface" 
     android:layout_height="fill_parent" 
     android:layout_width="fill_parent" 
     android:background="#00ff00"> 
    </SurfaceView> 

</LinearLayout> 

La actividad es una SurfaceHolder.Callback:

public class OpenCvonAndroidGTDforHOGActivity extends Activity implements SurfaceHolder.Callback{ 

    private SurfaceHolder _surfaceHolder; 
    private SurfaceView _surfaceView; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     _surfaceView = (SurfaceView)findViewById(R.id.imagesurface); 
     _surfaceHolder = _surfaceView.getHolder(); 
     _surfaceHolder.addCallback(this); 
     _surfaceView.setWillNotDraw(false); 

    } 

    protected void onDraw(Canvas canvas) { 
     canvas.drawRGB(255, 0, 255);    
    } 

    public void surfaceCreated(SurfaceHolder holder) { 
     Canvas canvas = null; 
     try { 
      canvas = holder.lockCanvas(); 
      synchronized(holder) { 
       onDraw(canvas); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      if (canvas != null) { 
       holder.unlockCanvasAndPost(canvas); 
      } 
     } 
    } 


    public void showToast(String msg) { 
     Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show(); 
    } 
} 

si llamo

_surfaceview.setBackground(Color.RED) en onDraw (...) funciona. Pero

canvas.drawRGB(255, 0, 255) no funciona :(

Respuesta

18

siguiente fragmento le ayudará.

public class SurfaceDemo extends Activity implements SurfaceHolder.Callback { 

    private static final String TAG = "Svetlin SurfaceView"; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     SurfaceView view = new SurfaceView(this); 
     setContentView(view); 
     view.getHolder().addCallback(this); 
    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     tryDrawing(holder); 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder holder, int frmt, int w, int h) { 
     tryDrawing(holder); 
    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) {} 

    private void tryDrawing(SurfaceHolder holder) { 
     Log.i(TAG, "Trying to draw..."); 

     Canvas canvas = holder.lockCanvas(); 
     if (canvas == null) { 
      Log.e(TAG, "Cannot draw onto the canvas as it's null"); 
     } else { 
      drawMyStuff(canvas); 
      holder.unlockCanvasAndPost(canvas); 
     } 
    } 

    private void drawMyStuff(final Canvas canvas) { 
     Random random = new Random(); 
     Log.i(TAG, "Drawing..."); 
     canvas.drawRGB(255, 128, 128); 
    } 
} 
+0

Funciona. ¿Pero por qué no funciona con Surfaceview desde el xml-layout? – ChHaupt

+1

es porque has mencionado android: background = "# 00ff00" .Si lo eliminas, tu código funcionará. Aunque no sé cuál es la razón. –

+0

Thx. Funciona sin android: background = "# 00ff00". No importa por qué. – ChHaupt

-3

¿Usted intentó

yourHolder.unlockCanvassAndPost(your_canvas); 
2

SurfaceView está compuesto por un View en su diseño actual y una superficie debajo de su diseño. Si establece un fondo para la vista, no verá nada de lo que está sucediendo en la superficie.

Cuestiones relacionadas