2012-05-02 6 views
5

मैं थ्रेड के अनुसार एक ही परिणाम प्राप्त करने की कोशिश कर रहा हूं: Make certain area of bitmap transparent on touch। मैं इस उत्तर में प्रस्तुत कोड से चिपक गया हूं: Lumis answer और स्टीड के अनुसार इस समाधान को काम करना चाहिए।टचमैप के कुछ क्षेत्र को स्पर्श पर पारदर्शी बनाएं -> फिर

दुर्भाग्य से मेरे लिए काम नहीं कर रहा है (और किसी अन्य उपयोगकर्ता के लिए: Make certain area of bitmap transparent on touch doesn't works, it's draw a black circle), मुझे बस काले सर्कल मिल रहा है। मैंने कई चीजों की कोशिश की लेकिन यह हल नहीं किया। दूसरे थ्रेड से सुझाव के अनुसार पृष्ठभूमि पारदर्शी बनाएं कोई फर्क नहीं पड़ता।

कई प्रयोगों के बाद मैंने पाया कि पारदर्शिता काम कर रहा है, जब मैं अपने AndroidManifest.xml में इस

android:theme="@android:style/Theme.Translucent" 

सेट कर रहा हूँ मैं अपने आवेदन अर्थात डेस्कटॉप के अंतर्गत सब कुछ देख सकते हैं। मैं कई बार कोड के माध्यम से गया और स्पष्ट गलती नहीं देख पा रहा हूं, केवल कारण मुझे लगता है कि यह जेड ऑर्डर है, लेकिन बिटमैप्स और कैनवास रखरखाव जेड ऑर्डर नहीं करते हैं। जेड ऑर्डरिंग कुछ ऑर्डर में ड्राइंग करके किया जाता है (जो इस कोड में सही है)।

क्या यह एंड्रॉइड कोड में ऑप्टिमाइज़ेशन का कुछ अजीब उदाहरण है, या मुझे एंड्रॉइड मेनिफेस्ट फ़ाइल में कुछ याद आ रहा है?

उत्तर

6

अंत में मैं समाधान है कि काम कर रहा है पाया:

@Override 
public void onDraw(Canvas canvas){ 
    super.onDraw(canvas); 

    //draw background 
    canvas.drawBitmap(bgr, 0, 150, null); 
    //copy the default overlay into temporary overlay and punch a hole in it       
    c2.drawBitmap(overlayDefault, 0, 0, null); //exclude this line to show all as you draw 
    c2.drawCircle(X, Y, 80, pTouch); 
    //draw the overlay over the background 
    //canvas.drawBitmap(overlay, 0, 0, null); 

    Paint new_paint = new Paint(/*Paint.ANTI_ALIAS_FLAG*/); 
    new_paint.setXfermode(new PorterDuffXfermode(Mode.SRC_ATOP)); 
    canvas.drawBitmap(overlay, 0, 0, new_paint); 
} 

लेकिन मुझे समझ नहीं आता क्यों काम कर रहा है। android Xfermodes demo और वह इस चित्र के अनुसार:: मैं इस स्रोत कोड के साथ xfermodes जांच था Xfermodes image

यह कोई मतलब नहीं, के अलावा कि xfermode सुनिश्चित करें कि ओवरले बिटमैप दूसरा तैयार सेम है (जेड आदेश) और पारदर्शिता खेलने के लिए आया था। लेकिन ऑर्डर ड्राइंग द्वारा जेड ऑर्डर बनाए रखा जाना चाहिए।

अगर किसी को यह बेहतर तरीके से पता चलता है कि इसे कैसे हल किया जाए, तो कृपया अपना ज्ञान साझा करें।

सम्मान।

+0

पेंट new_paint = नया पेंट (/ * पेंट.एएनटीआई_एएलआईएएस_एफएलजी * /); new_paint.setXfermode (नया पोर्टरडफैक्सफर्मोड (मोड.SRC_ATOP)); canvas.drawBitmap (ओवरले, 0, 0, new_paint); ================================================= = मुख्य बात थी, जिसने इसे हल किया – ViVekH

2

आप संपादित कर सकते OnDraw() विधि:

public void onDraw(Canvas canvas){ 
     super.onDraw(canvas); 
     canvas.drawColor(Color.TRANSPARENT); 
     canvas.drawBitmap(bgr, 0, 0, null); 

     c2.drawCircle(X, Y, 10, pTouch); 
     Paint new_paint = new Paint(/*Paint.ANTI_ALIAS_FLAG*/); 
     new_paint.setXfermode(new PorterDuffXfermode(Mode.SRC_ATOP)); 
     canvas.drawBitmap(overlay, 0, 0, new_paint); 
    } 

मैंने कोशिश की और यह काम किया! आशा है कि यह समाधान आपको

+0

धन्यवाद दोस्त .. इससे मेरी मदद की .. –

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