2012-06-07 14 views
8

मेरे पास "सरल" समस्या है। मैं सतही दृश्य पर आकर्षित करने की कोशिश करता हूं। लेआउट-एक्सएमएल:सतहदृश्य और कैनवास पर एंड्रॉइड ड्राइंग

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

तो मैं फोन

_surfaceview.setBackground(Color.RED) OnDraw में (...) यह काम करता है:

<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 है। लेकिन

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 से सतही दृश्य के साथ क्यों काम नहीं करता है? – ChHaupt

+1

क्योंकि आपने एंड्रॉइड का उल्लेख किया है: पृष्ठभूमि = "# 00ff00"। अगर आप इसे हटा दें तो आपका कोड काम करेगा। मुझे नहीं पता कि कारण क्या है। –

+0

Thx। यह एंड्रॉइड के बिना काम करता है: पृष्ठभूमि = "# 00ff00"। कोई फर्क नहीं पड़ता क्यों। – ChHaupt

-3

आप का प्रयास किया था

yourHolder.unlockCanvassAndPost(your_canvas); 
2

SurfaceView आपके वर्तमान लेआउट में एक View द्वारा रचित है और आपके लेआउट के नीचे एक सतह। यदि आप दृश्य में पृष्ठभूमि सेट करते हैं, तो आप जो भी हो रहा है उसके बारे में कुछ भी नहीं देखेंगे सतह पर।

संबंधित मुद्दे