2013-06-04 4 views
6

मैं एक चुनिंदा परिपत्र ImageView कैसे बना सकता हूं जैसे कि वर्तमान चित्रों के लिए उपयोग किए गए वर्तमान Google+ ऐप में?चुनिंदा परिपत्र छविदृश्य जैसे Google+

यह वह जगह है कि मैं क्या देखें:

Example

ऊपर छवि नहीं चुना जाता है और नीचे चयनित किया गया है।

loadedImageBitmap जो

mImageView.setBackground(createStateListDrawable()); 
mImageView.setImageBitmap(createRoundImage(loadedImage)); 

इस्तेमाल किया तरीकों प्रदर्शित किया जाता है:

मैं प्रोफ़ाइल चित्र 1 1. अब तक के

मेरा काम को दोहराने के लिए कोशिश

private Bitmap createRoundImage(Bitmap loadedImage) { Bitmap circleBitmap = Bitmap.createBitmap(loadedImage.getWidth(), loadedImage.getHeight(), Bitmap.Config.ARGB_8888); BitmapShader shader = new BitmapShader(loadedImage, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); Paint paint = new Paint(); paint.setAntiAlias(true); paint.setShader(shader); Canvas c = new Canvas(circleBitmap); c.drawCircle(loadedImage.getWidth()/2, loadedImage.getHeight()/2, loadedImage.getWidth()/2, paint); return circleBitmap; } private StateListDrawable createStateListDrawable() { StateListDrawable stateListDrawable = new StateListDrawable(); OvalShape ovalShape = new OvalShape(); ShapeDrawable shapeDrawable = new ShapeDrawable(ovalShape); stateListDrawable.addState(new int[] { android.R.attr.state_pressed }, shapeDrawable); stateListDrawable.addState(StateSet.WILD_CARD, shapeDrawable); return stateListDrawable; } 

ImageView का आकार imageSizePx है और छवि का आकार imageSizePx - 3 है। तो, इसका मतलब है कि पृष्ठभूमि को छवि को ओवरलैप करना चाहिए। जो काम नहीं करता है।

+1

आप की बात कर रहे हैं का एक स्क्रीनशॉट है? – CommonsWare

+0

शायद यह मदद करेगा। http://stackoverflow.com/questions/13108803/android-circle-menu-like-catch-notes – cgTag

+0

@ कॉमन्सवेयर एक मिनट प्रतीक्षा करें। – Leandros

उत्तर

6

सुझावों के लिए @CommonsWare के लिए धन्यवाद, वास्तव में सरल समाधान।

का आकार Bitmap: imageSizePx - 3DP
ImageView का आकार: imageSizePx

mImageView.setBackground(createStateListDrawable(imageSizePx)); 
mImageView.setImageBitmap(loadedImage); 

private StateListDrawable createStateListDrawable(int size) { 
    StateListDrawable stateListDrawable = new StateListDrawable(); 

    OvalShape ovalShape = new OvalShape(); 
    ovalShape.resize(size, size); 
    ShapeDrawable shapeDrawable = new ShapeDrawable(ovalShape); 
    shapeDrawable.getPaint().setColor(getResources().getColor(R.color.somecolor)); 

    stateListDrawable.addState(new int[]{android.R.attr.state_pressed}, shapeDrawable); 
    stateListDrawable.addState(new int[]{android.R.attr.state_focused}, shapeDrawable); 
    stateListDrawable.addState(new int[]{}, null); 

    return stateListDrawable; 
} 
2

आप एक कस्टम व्यू बना सकते हैं जो ImageView को बढ़ाता है। गोलाकार क्षेत्र के साथ कैनवास को क्लिप करने के लिए ओवरराइड करें और कैनवास पर छवि खींचें। एक प्रारंभिक बिंदु के रूप में कुछ इस तरह:

public class CircularImageView extends ImageView { 
    /* constructors omitted for brevity ... */ 

    protected void onDraw(Canvas canvas) { 
     int saveCount = canvas.save(); 

     // clip in a circle 

     // draw image 
     Drawable d = getDrawable(); 
     if (d != null) { 
      d.draw(canvas); 
     } 

     // do extra drawing on canvas if pressed 

     canvas.restoreToCount(saveCount); 
    } 
} 

कैनवास और एंड्रॉयड में अन्य 2 डी ड्राइंग API से परिचित पाने के लिए कुछ समय निकालें।

3

यह मानते हुए कि द्वारा "चयन" क्या आपका मतलब "चेक करने योग्य, एक CheckBox की तरह", तो हो सकता है कि कुछ CompoundButton कि "SkillOverflow" अग्रभूमि छवि के पीछे की पृष्ठभूमि के लिए नियमित रूप से और जाँच की राज्यों के साथ एक StateListDrawable उपयोग कर रहा है।

आप uiautomatorviewer का उपयोग कर सकते हैं यह देखने के लिए कि Google+ का वास्तविक विजेट क्या है।

+0

चुनने योग्य मेरा मतलब है कि मेरे पास टच फीडबैक है। मैं चुनिंदा शब्द का उपयोग करता हूं, क्योंकि डिफ़ॉल्ट एक्सएमएल को 'selectable_background_holo' भी नाम दिया जाता है। गड़बड़ी के लिए क्षमा। – Leandros

+0

@Leandros: फिर यह पृष्ठभूमि के लिए कस्टम 'स्टेटलिस्ट ड्रेवेबल' के साथ शायद 'छवि बटन' है। – CommonsWare

+0

सबसे अधिक संभावना है। मुद्दा यह है कि ऊपर दिए गए उदाहरण में प्रभाव कैसे बनाया जाए? सर्कुलर आकार का केवल एक स्ट्रोक वहां दिखाई देता है और पूरे आयताकार छविबटन/छवि दृश्य को हाइलाइट नहीं किया जाता है। – Leandros

0

मैं onDraw अधिभावी और "सीमा" के जब भी पता लगाता किसी प्रकार चित्रकला द्वारा एक कस्टम imageView के माध्यम से इस प्रभाव को प्राप्त करने में सक्षम था एक स्पर्श घटना। बोनस के रूप में, एक चयनकर्ता ओवरले है। उम्मीद है कि आप इस दृश्य से सहायक हो सकता ...

https://github.com/Pkmmte/CircularImageView

enter image description here