问题
How can I create a selectable circular ImageView
like in the current Google+ app used for the profile pictures?
This is what I refer to:

The image above is unselected and the below is selected.
I try to replicate the profile pictures 1 to 1.
My work so far:
loadedImage
is the Bitmap
which is displayed
mImageView.setBackground(createStateListDrawable());
mImageView.setImageBitmap(createRoundImage(loadedImage));
The used methods:
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;
}
The size of the ImageView
is imageSizePx
and the size of the image is imageSizePx - 3
. So, that means the background should overlap the image. Which doesn't work.
回答1:
Really simple solution, thanks to @CommonsWare for the tips.
Size of Bitmap
: imageSizePx - 3DP
Size of 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:
Assuming that by "selectable" you mean "checkable, like a CheckBox
", then that could be some CompoundButton
that is using a StateListDrawable
with regular and checked states for the background behind the "SkillOverflow" foreground image.
You can use uiautomatorviewer
to see what the actual widget is that Google+ uses.
回答3:
You can make a custom View that extends ImageView. Override onDraw to clip the canvas with a circular region and draw the image on the canvas. Something like this as a starting point:
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);
}
}
Take some time to get familiar with the Canvas and other 2D drawing APIs in Android.
回答4:
I was able to achieve this effect through a custom ImageView by overriding onDraw
and painting some sort of "border" whenever it detects a touch event. As a bonus, there is a selector overlay. Hopefully you may find this view helpful...
https://github.com/Pkmmte/CircularImageView

回答5:
https://github.com/hdodenhof/CircleImageView
Best library so far, super easy to integrate. It will give you border width and color option, you can change the color onClick to match your query.
来源:https://stackoverflow.com/questions/16922732/selectable-circular-imageview-like-google