2013-01-24 22 views
5

मैं डिफ़ॉल्ट SurfaceView कार्यान्वयन का उपयोग कर रहा हूं, कोड here पाया जा सकता है (यह एक उंगली ड्राइंग ऐप उदाहरण है, मैंने अभी इसे अक्षम कर दिया है और एक छवि खींची है)।SurfaceView में छवियों को गतिशील रूप से कैसे बदलें?

  1. एक गतिविधि क्लास (SurfaceViewSampleActivity)
  2. SurfaceView (CanvasView)
  3. थ्रेड वर्ग (UIThread) - वहाँ 3 मुख्य अलग वर्ग हैं।

SurfaceView कन्स्ट्रक्टर में सेट छवि (बिटमैप) खींचता है। मैंने कार्यक्षमता भी कार्यान्वित की जहां उपयोगकर्ता कैमरा ऐप को कॉल कर सकता है और एक तस्वीर ले सकता है। चित्र को डिफ़ॉल्ट छवि को स्वैप करना है (SurfaceView कन्स्ट्रक्टर सेट छवि पर)।

मैं अपने गतिविधि कक्षा में एक सरल विधि बना सकते हैं और बिटमैप सेट करने की कोशिश की है, लेकिन इस काम नहीं किया:

private void setImage() { 
    view.bitmap = this.mImageBitmap; 

} 

मैंने सोचा था कि SurfaceView धागा बिटमैप का उपयोग कर किया जा सकता है तो मैं लॉक करने के लिए करने की कोशिश की परिवर्तनीय:

private void setImage() { 
    synchronized (view.bitmap) { 
     view.bitmap = this.mImageBitmap; 
    } 
} 

ऐप भी क्रैश हो जाता है।

SurfaceView ड्रा विधि:

protected void onDraw(Canvas canvas) { 
    setPaintProperties(); 

    if (canvas != null) { 
     canvas.drawColor(Color.WHITE); 

     synchronized (this.bitmap) { 
      canvas.drawBitmap(this.bitmap, 0, 0, new Paint()); 
     } 

    } 
} 

वहाँ SurfaceView में बिटमैप चर बदलने के लिए किसी भी तरह से के बाद निर्माता बुलाया गया है है?

+0

सिंक्रनाइज़ (this.bitmap) के बिना कोशिश –

+0

क्रैश ... धन्यवाद त्वरित प्रतिक्रिया – user2003066

+0

के लिए Logcat से दुर्घटना स्टैकट्रेस पोस्ट करें। – acj

उत्तर

0

आपकी रन विधि कैसी दिखती है। मैं चंद्र लैंडर नमूना देखता हूं। आपको कैनवास को लॉक और अनलॉक करने की आवश्यकता है।

@Override 
    public void run() { 
     while (mRun) { 
      Canvas c = null; 
      try { 
       c = mSurfaceHolder.lockCanvas(null); 
       synchronized (mSurfaceHolder) { 
        if (mMode == STATE_RUNNING) updatePhysics(); 
        doDraw(c); 
       } 
      } finally { 
       // do this in a finally so that if an exception is thrown 
       // during the above, we don't leave the Surface in an 
       // inconsistent state 
       if (c != null) { 
        mSurfaceHolder.unlockCanvasAndPost(c); 
       } 
      } 
     } 
    } 
संबंधित मुद्दे