2012-06-07 9 views
8

Mam "prosty" problem. Próbuję narysować na powierzchni. Układ-XML:Rysunek Androida na powierzchni i płótnie

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

Activity jest 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(); 
    } 
} 

jeśli zadzwonię

_surfaceview.setBackground(Color.RED) w OnDraw (...) to działa. Ale

canvas.drawRGB(255, 0, 255) nie działa :(

Odpowiedz

18

Poniższy urywek pomoże

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

Działa. Ale dlaczego nie działa z widokiem powierzchni z układu xml? – ChHaupt

+1

to dlatego, że wspomniałeś android: background = "# 00ff00". Jeśli go usuniesz, twój kod będzie działał. Nie wiem, co jest powodem. –

+0

Thx. Działa bez Androida: background = "# 00ff00". Nieważne, dlaczego. – ChHaupt

-3

. Próbowałaś

yourHolder.unlockCanvassAndPost(your_canvas); 
2

SurfaceView składa się View w bieżącym układzie i powierzchnia pod twoim układem. Jeśli ustawisz tło dla widoku, nie zobaczysz niczego, co się dzieje na powierzchni.

Powiązane problemy