2012-07-01 18 views
24

मैं एक कस्टम दृश्य बनाने की कोशिश कर रहा हूं जिसमें पाठ के नीचे आकार धुंधला हुआ है। समस्या यह है कि BlurMaskFilter का कैनवास पर खींचे गए किसी भी आकार पर कोई प्रभाव नहीं पड़ता है।एंड्रॉइड ब्लरमास्कफिल्टर का कैनवास.drawOval में कोई प्रभाव नहीं पड़ता है जबकि पाठ धुंधला हुआ है

paint = new Paint(0); 
paint.setColor(0xffffffff); 
paint.setMaskFilter(new BlurMaskFilter(8, BlurMaskFilter.Blur.NORMAL)); 

mShadowPaint = new Paint(0); 
mShadowPaint.setColor(0xff333333); 
mShadowPaint.setMaskFilter(new BlurMaskFilter(10, BlurMaskFilter.Blur.NORMAL)); 

और मैं OnDraw() में इस तरह के कार्यों फोन कर रहा हूँ: यहाँ कैसे मैं निर्माता में पेंट वस्तुओं initialising कर रहा हूँ है

canvas.drawOval(mShadowBounds,mShadowPaint); 
canvas.drawText("hello", x, y, paint); 

लेकिन यह मैं क्या देखते हैं।

The Oval is not blurred yet the text is blurred.

एक 4.0.4 आकाशगंगा गठजोड़ डिवाइस (यूके) पर एंड्रॉयड 4.0 एसडीके और परीक्षण का उपयोग करना। मैं सोच रहा हूं कि यह 4.0.4 में एक बग है क्योंकि मैंने इसे 4.0 और 4.0.3 के साथ एमुलेटर पर परीक्षण किया था और जब तक कि मैं कुछ पूरी तरह से गलत नहीं कर रहा हूं, तब तक यह पूरी तरह से धुंधला हुआ?

संपादित करें: यहां अन्य प्लेटफ़ॉर्म पर इसका परीक्षण करने के लिए विस्तारित व्यू कोड है।

import android.content.Context; 
import android.graphics.BlurMaskFilter; 
import android.graphics.Canvas; 
import android.graphics.Paint; 
import android.graphics.RectF; 
import android.util.AttributeSet; 
import android.view.View; 

public class BlurTestView extends View{ 

    private Paint paint; 
    private Paint mShadowPaint; 
    private int size = 100; 
    private RectF mShadowBounds = new RectF(); 

    public BlurTestView(Context context) { 
     this(context, null, 0); 
    } 

    public BlurTestView(Context context, AttributeSet attrs) { 
     this(context, attrs, 0); 
    } 

    public BlurTestView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     paint = new Paint(0); 
     paint.setColor(0xff333333); 
     paint.setTextSize(size); 
     paint.setMaskFilter(new BlurMaskFilter(8, BlurMaskFilter.Blur.NORMAL)); 

     mShadowPaint = new Paint(0); 
     mShadowPaint.setColor(0xff333333); 
     mShadowPaint.setMaskFilter(new BlurMaskFilter(10, BlurMaskFilter.Blur.NORMAL)); 

     mShadowBounds.top = size; 
     mShadowBounds.bottom = mShadowBounds.top+(size /2); 
     mShadowBounds.left = 0; 
     mShadowBounds.right = (int)paint.measureText("hello"); 
    } 

    @Override 
    public void onDraw(Canvas canvas) 
    { 
     canvas.drawOval(mShadowBounds,mShadowPaint); 
     canvas.drawText("hello", 0, size, paint); 
    } 

} 
+2

मैं गैलेक्सी नेक्सस पर 4.0.4 चल रहा एक ही चीज़ देख रहा हूं, केवल टेक्स्ट धुंधला हुआ है, और कुछ नहीं। मेरे जिंजरब्रेड इनक्रेडिबल पर एक ही टेस्ट ऐप चलाने से सभी आकार और टेक्स्ट ब्लूर्स हो जाते हैं। – Josh

उत्तर

36

मुझे एक बग की तरह लग रहा है। मैंने इसे एंड्रॉइड टीम को बताया; हम देखेंगे कि वे क्या कहते हैं।

यदि आप AndroidManifest.xml में अपनी गतिविधि पर android:hardwareAccelerated="false" सेट करते हैं तो यह सही ढंग से प्रस्तुत करता है।

एंड्रॉइड ग्राफिक्स टीम का आधिकारिक शब्द यहां दिया गया है: "ब्लरमास्कफ़िल्टर हार्डवेयर त्वरण के साथ समर्थित नहीं है।" (10 जुलाई, 2012 तक)

+0

हाँ हार्डवेयर त्वरण गलत पर सेट होने पर यह सही ढंग से प्रस्तुत करता है। लेकिन दुर्भाग्य से मैं ऐसा नहीं कर सकता क्योंकि एप्लिकेशन हार्डवेयर त्वरण का उपयोग करता है। यद्यपि आपके उत्तर के लिए धन्यवाद। –

+0

मुझे लगता है कि ज्यादातर हार्डवेयर प्रतिपादन का उपयोग करना उचित है, लेकिन जब तक प्रदर्शन अच्छा होता है, तब तक विशिष्ट गतिविधियों पर सॉफ़्टवेयर प्रतिपादन को मजबूर करना पड़ता है। – Sparky

+0

मैंने कोशिश की, प्रदर्शन काफी खराब हो गया है। –

1

मुझे पथ में फ़िल्टर जोड़ने के दौरान एक ही समस्या थी। मैंने देखा कि 13 या उससे नीचे के लक्ष्य को सेट करने से फ़िल्टर काम कर सकते हैं। 14 और ऊपर उन्होंने नहीं किया।

android:targetSdkVersion="13" 
+0

एपीआई 11 में हार्डवेयर त्वरण को पेश करने पर अजीब बात है। –

+0

यहां तक ​​कि अजनबी, जब मैंने बिटमैप पर दृश्य को मिश्रित किया, तो नए बिटमैप ने इसे प्रतिलिपि में धुंध से दिखाया। वास्तव में अजीब – a54studio

+1

तो ब्लरमास्कफिल्टर के बिना इस धुंध प्रभाव को कैसे प्राप्त किया जाए इस पर कोई विकल्प है? एचडब्ल्यू रेंडरिंग ऑफ़ सेट करना वास्तव में एनिमेशन को धीमा कर देता है। – Uday

1

आप अपनी गतिविधि में हार्डवेयर त्वरण अक्षम नहीं कर सकते तो आप सिर्फ पहले पैरामीटर LAYER_TYPE_SOFTWARE और अपने दृश्य के लिए दूसरा पैरामीटर अशक्त साथ setLayerType कॉल कर सकते हैं (उदाहरण के लिए यह TextureView जो हार्डवेयर त्वरण की आवश्यकता का उपयोग करता है)।

इस

public class BlurTestView extends View { 

    public BlurTestView(Context context) { 
     this(context, null, 0); 
    } 

    public BlurTestView(Context context, AttributeSet attrs) { 
     this(context, attrs, 0); 
    } 

    public BlurTestView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 

     // Disable hardware acceleration for this view 
     setLayerType(View.LAYER_TYPE_SOFTWARE, null); 

     // Perform other initialisation 
    } 

    // Other methods and so on... 
} 

अधिक मुखौटा फिल्टर, प्रभाव और shaders आप here पा सकते हैं के बारे में जानकारी की तरह

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