2012-06-20 16 views
9

मैं एंड्रॉइड देव के लिए नया हूं, और मैं बिना किसी सफलता के एक छवि दृश्य में अच्छे और चिकनी गोलाकार कोनों को जोड़ने के लिए कुछ घंटों की कोशिश कर रहा हूं।एंड्रॉइड छवि दृश्य पर एंटीअलाइज्ड गोलाकार कोनों

पहली चीज मैंने कोशिश की है कि मेरी छवियों के कोनों को सीधे गोल करना है, लेकिन यह बिटमैप को बदलने का तात्पर्य है, और चूंकि मुझे कच्चे रखने की जरूरत है, और ये बहुत बड़े हैं, यह वास्तव में स्मृति अनुकूल नहीं है। यह मेरी छवि दृश्य तरल पदार्थ के बाद से अन्य कठिनाइयों का भी कारण बन जाएगा।

दूसरी बात जो मैंने उपयोग करने की कोशिश की वह क्लिपपैथ विधि है जो मेरे दृश्य को उपclassing के बाद है। यह काम करता है, लेकिन कोनों को एलियाड किया जाता है। मैंने एलियासिंग को लागू करने के लिए एक पेंटफ्लैग ड्रॉफिल्टर जोड़ने की कोशिश की, लेकिन यह काम नहीं किया। मैं मोनोड्रॉइड का उपयोग कर रहा हूं, और मैं सोच रहा था कि यह जावा में काम करना था।

public class MyImageView : ImageView 
{ 
    private float[] roundedCorner; 

    /** 
    * Contains the rounded corners for the view. 
    * You can define one, four or height values. 
    * This behaves as the css border-radius property 
    * 
    * @see http://developer.android.com/reference/android/graphics/Path.html#addRoundRect(android.graphics.RectF, float[], android.graphics.Path.Direction) 
    */ 
    public float[] RoundedCorners{ 
     get{ 
      return roundedCorner; 
     } 
     set{ 
      float[] finalValue = new float[8]; 
      int i=0; 
      if(value.Length == 1){ 
       for(i=0; i<8;i++){ 
        finalValue[i] = value[0]; 
       } 
      }else if(value.Length == 4){ 
       for(i=0; i<4;i++){ 
        finalValue[2*i] = value[i]; 
        finalValue[2*i+1] = value[i]; 
       } 
      } 

      roundedCorner = finalValue; 
     } 
    } 

    public SquareImageView (Context context) : 
     base (context) 
    { 
     Initialize(); 
    } 

    public SquareImageView (Context context, IAttributeSet attrs) : 
     base (context, attrs) 
    { 
     Initialize(); 
    } 

    private void Initialize() 
    { 
     RoundedCorners = new float[]{0,0,0,0}; 
    } 

    public override void Draw (Android.Graphics.Canvas canvas) 
    { 
     Path path = new Path(); 
     path.AddRoundRect(new RectF(0,0, Width,Height),RoundedCorners, Path.Direction.Cw); 

     canvas.ClipPath(path); 

     base.Draw (canvas); 
    } 

    /** 
    * try to add antialiasing. 
      */ 
    protected override void DispatchDraw (Canvas canvas) 
    { 

     canvas.DrawFilter = new PaintFlagsDrawFilter((PaintFlags)1, PaintFlags.AntiAlias); 
     base.DispatchDraw (canvas); 
    } 

} 

आपकी मदद के लिए धन्यवाद:

यहाँ मेरी कोड (सी #) है!

उत्तर

1

कोड के नीचे उपयोग

public Bitmap getRoundedCornerBitmap(Bitmap bitmap, int pixels) 
    { 
     Bitmap output = null; 

     if(bitmap != null) 
     { 
      output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888); 
      Canvas canvas = new Canvas(output); 

      final int color = 0xff424242; 
      final Paint paint = new Paint(); 
      final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); 
      final RectF rectF = new RectF(rect); 
      final float roundPx = pixels; 

      paint.setAntiAlias(true); 
      canvas.drawARGB(0, 0, 0, 0); 
      paint.setColor(color); 
      canvas.drawRoundRect(rectF, roundPx, roundPx, paint); 

      paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); 
      canvas.drawBitmap(bitmap, rect, rect, paint); 
     } 

     return output; 
    } 

और कॉल इस विधि की तरह

imageView.setImageBitmap(getRoundedCornerBitmap(bitmap, 10)); 
+0

आपके उत्तर के लिए धन्यवाद। लेकिन जैसा कि मैंने कहा, मैंने पहले से ही अपनी छवि के कोनों को गोल करने की कोशिश की है, लेकिन चूंकि मुझे द्रव आकार बिटमैप की आवश्यकता है, इसलिए इसका मतलब मूल के संदर्भ में है, और मैं इससे बचना चाहता हूं। असल में मैं दृश्य के कोनों को गोल करना चाहता हूं, जैसे कि मैं इस समाधान का उपयोग कर रहा था: [लिंक] (http://stackoverflow.com/questions/1683185/android-listview-with-rounded-corners) –

+1

ठीक @Alex इसे देखें [लिंक] (http://stackoverflow.com/questions/6539781/android-imageview-with-rounded-corners-not-working) –

2

मेरे द्वारा बनाए गए एक RoundedImageView बंद आधारित रोमेन लड़का के example code कि एक imageView है कि आप में सक्षम होना चाहिए में इस तर्क लपेटता महज प्रयोग करें। यह बॉक्स से बाहर सीमाओं और antialiasing का समर्थन करता है।

यह अन्य गोलाकार कोने उदाहरणों की तुलना में अधिक कुशल है क्योंकि यह बिटमैप की एक और प्रति नहीं बनाता है, न ही यह क्लिपपैथ का उपयोग करता है जो कैनवास में दो बार आकर्षित करता है।

+0

यह अच्छा लग रहा है, और ऐसा लगता है कि मैं क्या देख रहा था। मेरे पास अभी परीक्षण करने के लिए कोई एंड्रॉइड नहीं है, इसलिए मुझे यकीन नहीं है कि मुझे इस प्रश्न को उत्तर के रूप में चिह्नित करना चाहिए या नहीं –

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