2011-01-10 9 views
11

मैं कुछ सफलता के साथ एक कस्टम दृश्य की पृष्ठभूमि छवि बदलने की कोशिश कर रहा हूँ। छवि बदल जाएगी लेकिन समस्या यह है कि मैं अभी भी पुरानी छवि के निशान देखता हूं। जब मैं नई छवि खींचने से पहले कैनवास को साफ़ करने का प्रयास करता हूं, तो यह काम नहीं करता है। मैं छवि को स्टोर करने के लिए एक बिटमैप बनाते हैं। छवि को बदलते समय, मैं नई छवि खींचने से पहले Canvas.drawColor() को कॉल करता हूं लेकिन पुरानी छवि बनी रहती है। मैं drawColor (0), drawColor (Color.BLACK), c.drawColor (0, PorterDuff.Mode.CLEAR), और ऊपर काम करता है में से कोई भी कोशिश की है। इस तरह, मुझे इसे मुझसे अधिक अनुभवी दिमाग से समीक्षा के लिए पोस्ट करना पड़ा।क्लियरिंग कैनवास()

private int bgnd; 
private boolean switching; 

public void setBgnd(int incoming){ 
    switching = true; 
    switch (incoming){ 

    case R.drawable.image1: 
     bgnd = incoming; 
     this.invalidate(); 
     break; 

    case R.drawable.image2: 
     bgnd = incoming; 
     this.invalidate(); 
     break; 

    } 
} 



protected void onDraw(Canvas c){ 
    if(switching == true){ 
     Bitmap b = BitmapFactory.decodeResource(getResources(), bgnd); 
     c.drawColor(0, PorterDuff.Mode.CLEAR); 
     c.drawBitmap(b, 0, 0, null); 
     switching = false; 

    }else{ 
     Bitmap b = BitmapFactory.decodeResource(getResources(), bgnd); 
     c.drawBitmap(b, 0, 0, null); 
    } 
} 

उत्तर

30
बस आप की तरह

, मैं कैसे अपने एक से अधिक परत/SurfaceView अनुप्रयोग में एक शीर्ष स्तर/SurfaceView स्पष्ट करने के लिए संघर्ष किया। खोज और कोडिंग के 2 दिनों के बाद, मैंने अपना रास्ता खोज लिया और इस तरह मैंने ड्राइंग से पहले कैनवास को साफ़ किया, आप कई परतों/सतहदृश्यों के दौरान इसका उपयोग कर सकते हैं। पृष्ठभूमि परत काले रंग से ढकी नहीं होगी, यह चाल है।

Paint paint = new Paint(); 
paint.setXfermode(new PorterDuffXfermode(Mode.CLEAR)); 
canvas.drawPaint(paint); 
paint.setXfermode(new PorterDuffXfermode(Mode.SRC)); 
// start your own drawing 
+0

मुझे लगता है कि यह मुझे बाहर निकलने के लिए 2 मिनट से अधिक समय ले गया होगा। Thx funnyInAStrangerLand + longdooooo –

2

आप भी अपने OnDraw विधि के भीतर से रद्द() कॉल करने की आवश्यकता नहीं है, इसलिए है कि कि OnDraw में किए गए परिवर्तनों स्क्रीन पर अपडेट किया जाता है,:

वास्तविक कोड इस प्रकार है?

रद्द() अपने स्विच अपने OnDraw लागू करेगा के बाद आप setBgnd फोन है, लेकिन वहाँ कुछ भी नहीं करने के बाद आप कैनवास में परिवर्तन किए हैं पुनः बनाने का कह रहा है में।

+1

मैं छाप कॉल कि अमान्य() के तहत कर रहा हूँ एक दृश्य बता OnDraw() कहते हैं और अपने स्वयं आकर्षित करने के लिए होगा। किया जा रहा है मामला विधि में है कि कॉल डाल हमेशा के लिए लूप को यह कारण होगा, के रूप में में उदाहरण में देखा है कि: http://www.anddev.org/basic_and_simple_2d_drawing_-_animation-t3085.html – Prmths

+0

आह आप कर रहे हैं ठीक है, के लिए था इसे देखो, http://developer.android.com/guide/topics/graphics/index.html। क्षमा करें मेरी समझ सही नहीं थी। – C0deAttack

+0

मैंने सोचा कि शुरुआत में भी। मेरे लिए सवाल यह है कि, अगर अमान्य() खुद को फिर से निकालने के लिए एक दृश्य बताता है, तो यह दृश्य पूरी तरह से फिर से क्यों नहीं आ जाता है जब तक कि इसे एनीमेशन में स्थानांतरित नहीं किया जाता है? ऑब्जेक्ट का निचला आधा सही दिखता है लेकिन दूसरा आधा अभी भी पुरानी सतह है। – Prmths

2

आप कैनवास की विधि drawRGB का उपयोग कर सकते हैं।

+0

drawRGB() अल्फा चैनल को साफ़ नहीं करता है और बिटमैप अपारदर्शी हो जाएगा, इसलिए इसका उपयोग केवल तभी किया जा सकता है जब बिटमैप एकमात्र परत या पृष्ठभूमि परत हो। एक विधि drawarGB() भी है, जो अल्फा चैनल का इलाज करने की अनुमति भी देती है। अगर यह काम करता है, तो कोशिश नहीं की है। –

+1

ध्यान दें कि drawRGB बस 'drawColor (Color.rgb (r, g, b) का उपयोग करता है) ' – TameHog