2012-08-09 14 views
6

मेरे पास ImageView सबक्लास है जिसका उपयोग मैं गोलाकार कोनों वाले चित्रों को आकर्षित करने के लिए करता हूं। कोड this answer पर आधारित है, और है निम्नानुसार है:गोलाकार कोनों के साथ एक छवि दृश्य को चित्रित करते समय क्षमता

public class ImageViewRoundedCorners extends ImageView { 
    ... 
    @Override 
    protected void onDraw(Canvas canvas) { 
     Bitmap scaledBitmap = Bitmap.createBitmap(getMeasuredWidth(), 
                getMeasuredHeight(), 
                Bitmap.Config.ARGB_8888); 
     Canvas scaledCanvas = new Canvas(scaledBitmap); 
     super.onDraw(scaledCanvas); 
     drawRoundedCornerBitmap(canvas, scaledBitmap, 
           getMeasuredWidth(), getMeasuredHeight()); 

     scaledBitmap.recycle(); 
    } 

    protected void drawRoundedCornerBitmap(Canvas outputCanvas, Bitmap input, int w, int h) { 
     Bitmap output = Bitmap.createBitmap(w, h, Config.ARGB_8888); 
     Canvas canvas = new Canvas(output); 

     mPaint.reset(); 
     mPaint.setAntiAlias(true); 
     canvas.drawARGB(0, 0, 0, 0); 

     mPaint.setStyle(Paint.Style.FILL); 
     canvas.drawPath(mClipPath, mPaint); 

     mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); 
     canvas.drawBitmap(input, 0, 0, mPaint); 

     outputCanvas.drawBitmap(output, 0, 0, null); 
    } 
} 
इस कोड के साथ

, छवि ठीक गोलाकार कोनों के साथ तैयार की है। drawRoundedCornerBitmap की पहली दो पंक्तियों पर आवंटन से बचने के लिए, मैं सीधे outputCanvas पर आकर्षित करना चाहता हूं, जो मूल रूप से onDraw पर कैनवास पास हो गया है। नई कार्यान्वयन इस तरह दिखता है:

protected void drawRoundedCornerBitmap(...) { 
    mPaint.reset(); 
    mPaint.setAntiAlias(true); 
    outputCanvas.drawARGB(0, 0, 0, 0); 

    mPaint.setStyle(Paint.Style.FILL); 
    outputCanvas.drawPath(mClipPath, mPaint); 

    mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); 
    outputCanvas.drawBitmap(input, 0, 0, mPaint); 
} 

किसी कारण के लिए, इस कोड पोर्टर-गूंथा हुआ आटा मोड अनदेखी करने के लिए लगता है, और इसके बजाय सिर्फ सामान्य (गैर- गोल) कोनों के साथ छवि खींचता है। यह एक केस क्यों है? इंटरमीडिएट Bitmap पर ड्राइंग के बारे में क्या है जो मूल कोड काम करता है?

+0

मुझे भी वही समस्या है। –

+0

क्या आपको इसके लिए कोई समाधान मिला है ... यहां तक ​​कि मैं भी एक ही कोशिश कर रहा हूं :( –

उत्तर

0

एक आकर्षित करने योग्य रोमैन गाय ने आपके लिए यह किया है। हम एक लिंक फैक्ट्री नहीं हैं लेकिन उनके ब्लॉग पोस्ट ने इसे काफी व्यापक रूप से समझाया है और ऐसा करने का एक प्रभावी तरीका प्रदान करता है। Rounded Corners

असली बुनियादी सिद्धांत, एक BitmapShader बना सकते हैं और यह एक Paint वस्तु जो एक कस्टम Drawable कि जिस तरह से तुम सिर्फ लागू कि Drawable को ImageView में ड्रॉ से संलग्न है।

एक ड्रॉइंग का उपयोग करना मतलब है कि छवि केवल एक कैनवास के लिए चित्रित की जाती है, जिसका अर्थ यह है कि छवि को चित्रित करना केवल एक बार किया जाता है, तो सभी छवि दृश्य केवल ड्रायबल होते हैं।

+0

क्या इस तरह का कोई दर्द नहीं है जब आपको छवि दृश्य में खींचने योग्य स्केल करना है? खींचने योग्य बनाया गया है, फिर फैला हुआ है या फसल है, जिसका अर्थ है कि आपके कोनों को अजीब लगने वाला है, नहीं? – secureboot

+0

'छवि दृश्य' को याद रखें जो आप इसे 'ड्रायबल' में पास करते हैं, उसका आकार प्रदान करता है, फिर 'ड्रायबल' पर 'ड्रा() 'कॉल करता है। डिफ़ॉल्ट रूप से आपके पास बिटमैप ड्रायबल था, यह निश्चित रूप से इसे फैलाएगा, क्योंकि आप 'RoundedBitmapDrawable' प्रति-पास पास करते हैं, यह उस कार्यान्वयन के आधार पर आकर्षित होगा। –

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