2012-06-07 14 views
8

Ho un problema "semplice". Provo a disegnare surfaceview. Disposizione-XML:Disegno Android su superficie e tela

<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> 

L'attività è un 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(); 
    } 
} 

se chiamo

_surfaceview.setBackground(Color.RED) in OnDraw (...) funziona. Ma

canvas.drawRGB(255, 0, 255) non funziona :(

risposta

18

seguente frammento vi aiuterà.

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

Funziona. Ma perché non funziona con surfaceview dal layout xml? – ChHaupt

+1

perché hai menzionato android: background = "# 00ff00". Se lo rimuovi, il tuo codice funzionerà. Anche se non so quale sia la ragione. –

+0

Thx. Funziona senza Android: background = "# 00ff00". Non importa perché. – ChHaupt

-3

Hai provato

yourHolder.unlockCanvassAndPost(your_canvas); 
2

SurfaceView è composto da un View nel layout corrente e una superficie sotto il tuo layout: se imposti uno sfondo alla vista, non vedrai nulla di ciò che sta accadendo sulla superficie.