2012-06-07 69 views
8

我有一个“简单”问题。我尝试绘制surfaceview。布局XML:安卓在Surfaceview和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> 

该活动是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(); 
    } 
} 

如果我称之为的onDraw

_surfaceview.setBackground(Color.RED) (...),它的工作原理。但

canvas.drawRGB(255, 0, 255) 不工作:(

回答

18

下面的代码片段会帮助你。

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

它的工作原理。但为什么不从xml-layout的surfaceview中工作? – ChHaupt

+1

它因为你已经提到android:background =“#00ff00”。如果你删除它,那么你的代码将工作。尽管我不知道是什么原因。 –

+0

Thx。它的工作原理没有android:background =“#00ff00”。无论如何。 – ChHaupt

-3

你尝试

yourHolder.unlockCanvassAndPost(your_canvas); 
2

SurfaceViewView在当前布局组成以及布局下的表面,如果您为视图设置背景,则不会看到发生的任何事情在表面上。