效果
功能
- 生成類似釘釘、微信 羣聊組合頭像Bitmap
- 多圖拼接展示(目前最多支持九張圖)
- 可圖文混合展示
- 可展示成圓角、方角、圓形
- 可自定義分割線寬度、顏色、背景色、文字大小顏色等
實現
attr.xml
<declare-styleable name="AvatarImageView">
<attr name="avatarType" format="enum">
<enum name="circle" value="1" />
<enum name="rectangle" value="2" />
<enum name="roundRect" value="2" />
</attr>
<!--<attr name="avatarBg" format="color|reference" />-->
<attr name="avatarMargin" format="dimension|reference" />
<attr name="avatarMarginColor" format="color|reference" />
<attr name="showDivider" format="boolean" />
<attr name="textBg" format="color|reference" />
<attr name="textColor" format="color|reference" />
<attr name="textSize" format="dimension|reference" />
<attr name="roundCorner" format="dimension|reference" />
<attr name="bgColor" format="color|reference" />
</declare-styleable>
AvatarImageView
public class AvatarImageView extends android.support.v7.widget.AppCompatImageView {
private static final int TYPE_CIRCLE = 1;
private static final int TYPE_RECTANGLE = 2;
private static final int TYPE_ROUND_RECTANGLE = 3;
private static final int LOCATION_TYPE_CIRCLE_1 = 1;
private static final int LOCATION_TYPE_CIRCLE_2 = 2;
private static final int LOCATION_TYPE_CIRCLE_3 = 3;
private static final int LOCATION_TYPE_CIRCLE_4 = 4;
private static final int LOCATION_TYPE_RECTANGLE_1 = 11;
private static final int LOCATION_TYPE_RECTANGLE_2 = 12;
private static final int LOCATION_TYPE_RECTANGLE_3 = 13;
private static final int LOCATION_TYPE_RECTANGLE_4 = 14;
private static final int LOCATION_TYPE_RECTANGLE_5 = 15;
private static final int LOCATION_TYPE_RECTANGLE_6 = 16;
private static final int LOCATION_TYPE_RECTANGLE_7 = 17;
private static final int LOCATION_TYPE_RECTANGLE_8 = 18;
private static final int LOCATION_TYPE_RECTANGLE_9 = 19;
private List<Object> headObjList;
private int type;
private int margin;
private int marginColor;
private boolean showDivider;
private Paint paint;
private int width;
private int height;
private int textBg;
private int textColor;
private int textSize;
private int roundCorner;
private int bgColor;
public AvatarImageView(Context context) {
this(context, null);
}
public AvatarImageView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public AvatarImageView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.AvatarImageView);
type = typedArray.getInt(R.styleable.AvatarImageView_avatarType, 1);
margin = (int) typedArray.getDimension(R.styleable.AvatarImageView_avatarMargin, 0);
marginColor = typedArray.getColor(R.styleable.AvatarImageView_avatarMarginColor, getResources().getColor
(android.R.color.transparent));
showDivider = typedArray.getBoolean(R.styleable.AvatarImageView_showDivider, false);
textBg = typedArray.getColor(R.styleable.AvatarImageView_textBg, 0);
textSize = (int) typedArray.getDimension(R.styleable.AvatarImageView_textSize, 0);
textColor = typedArray.getColor(R.styleable.AvatarImageView_textColor, 0);
roundCorner = (int) typedArray.getDimension(R.styleable.AvatarImageView_roundCorner, 0);
bgColor = typedArray.getColor(R.styleable.AvatarImageView_bgColor, 0);
typedArray.recycle();
paint = new Paint();
paint.setAntiAlias(true);
}
public void setHeadObjList(List<Object> headObjList) {
for (int i = 0; i < headObjList.size(); i++) {
try {
Object object = headObjList.get(i);
if (object instanceof Integer) {
// Drawable drawable = (Drawable) object;
// Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(),
// drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config
// .RGB_565);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), (Integer) object);
headObjList.set(i, bitmap);
}
} catch (Exception e) {
e.printStackTrace();
}
}
this.headObjList = headObjList;
invalidate();
}
@Override
protected void onDraw(Canvas canvas) {
width = getWidth();
height = getHeight();
RectF rectF = new RectF(0, 0, width, height);
int layerBg = canvas.saveLayer(rectF, null, Canvas.ALL_SAVE_FLAG);
super.onDraw(canvas);
Path path = new Path();
if (type == TYPE_CIRCLE) {
float cx = width / 2;
float cy = height / 2;
float radius = Math.min(width, height) / 2;
path.addCircle(cx, cy, radius, Path.Direction.CW);
} else if (type == TYPE_ROUND_RECTANGLE) {
path.addRoundRect(rectF, roundCorner, roundCorner, Path.Direction.CW);
} else if (type == TYPE_RECTANGLE) {
path.addRect(rectF, Path.Direction.CW);
}
// paint.setColor(ContextCompat.getColor(getContext(), android.R.color.transparent));
paint.setColor(bgColor);
canvas.drawPath(path, paint);
canvas.clipPath(path);
paint.reset();
paint.setAntiAlias(true);
if (type == TYPE_RECTANGLE || type == TYPE_ROUND_RECTANGLE) {
RectF rect = new RectF(margin, margin, width - margin, height - margin);
canvas.saveLayer(rect, null, Canvas.ALL_SAVE_FLAG);
path.addRect(rect, Path.Direction.CW);
canvas.clipPath(path);
}
DrawAvatarItem drawAvatarItem = null;
if (type == TYPE_CIRCLE) {
drawAvatarItem = new DrawCircleAvatarItem(canvas, paint, width, height, headObjList, margin, textBg,
textSize, textColor);
} else if (type == TYPE_RECTANGLE) {
drawAvatarItem = new DrawRectangleAvatarItem(canvas, paint, width, height, headObjList, margin, textBg,
textSize, textColor);
}
drawAvatarItem.draw();
if (showDivider) {
drawAvatarItem.drawDividers(margin, marginColor);
}
// path.reset();
// if (type == TYPE_CIRCLE) {
// float cx = width / 2;
// float cy = height / 2;
// float radius = Math.min(width, height) / 2;
// path.addCircle(cx, cy, radius, Path.Direction.CW);
// } else if (type == TYPE_RECTANGLE) {
// path.addRoundRect(rectF, 10, 10, Path.Direction.CW);
//
// }
// canvas.restoreToCount(layerBg);
// paint.setColor(marginColor);
// paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
// canvas.drawPath(path, paint);
// paint.setXfermode(null);
}
}
DrawAvatarItem
public abstract class DrawAvatarItem {
public Paint paint;
public Canvas canvas;
public int width;
public int height;
public int itemCount;
public List<Object> headObjList;
public int dividerWidth;
public float[] dividers = new float[]{};
private int textBg;
private int textColor;
private int textSize;
public @interface ClipType {
int CLIP_TYPE_NO_ = 0;
int CLIP_TYPE_HALF_CENTER = 1;
int CLIP_TYPE_ONE_QUARTER = 2;
}
public class ItemType {
public static final int ITEM_TYPE_NORMAL = 0;
public static final int ITEM_TYPE_LEFT = 1;
public static final int ITEM_TYPE_RIGHT = 2;
public static final int ITEM_TYPE_LEFT_TOP = 3;
public static final int ITEM_TYPE_LEFT_BOTTOM = 4;
public static final int ITEM_TYPE_RIGHT_TOP = 5;
public static final int ITEM_TYPE_RIGHT_BOTTOM = 6;
}
public DrawAvatarItem(Canvas canvas, Paint paint, int width, int height, List<Object> headObjList, int
dividerWidth, int textBg, int textSize, int textColor) {
this.canvas = canvas;
this.paint = paint;
this.width = width;
this.height = height;
this.headObjList = headObjList;
itemCount = headObjList == null ? 0 : headObjList.size();
this.dividerWidth = dividerWidth;
this.textBg = textBg;
this.textColor = textColor;
this.textSize = textSize;
}
protected abstract void draw();
protected abstract void drawItem(int itemType, Object object, @ClipType int clipType);
public void drawItem(Object object, Rect dst) {
drawItem(object, dst, -1);
}
public void drawItem(Object object, Rect dst, int type) {
if (object instanceof String) {
drawText((String) object, dst);
} else if (object instanceof Bitmap) {
drawImg((Bitmap) object, dst, type);
}
}
public void drawText(String text, Rect dst) {
paint.setColor(textBg);
canvas.drawRect(dst,paint);
paint.setColor(textColor);
paint.setTextSize(textSize);
paint.setTextAlign(Paint.Align.CENTER);//水平居中
TextPaint textPaint = new TextPaint();
textPaint.setTextSize(textSize);
Paint.FontMetrics fontMetrics = textPaint.getFontMetrics();
int x = (dst.left + dst.right) / 2;
int baseline = (int) ((dst.bottom + dst.top) / 2 - (fontMetrics.top + fontMetrics.bottom) / 2);
canvas.drawText(text, x, baseline, paint);
}
public void drawImg(Bitmap bitmap, Rect dst, int type) {
Rect src = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
Bitmap clipBitmap = clipBitmap(bitmap, type);
canvas.drawBitmap(clipBitmap, src, dst, paint);
}
/**
* 圖片裁剪,左右佈局的裁剪中間一塊,寬1/2,高1;四分佈局的裁剪中間1/4,寬1/2,高1/2
*
* @param bitmap
* @param type
* @return
*/
private Bitmap clipBitmap(Bitmap bitmap, int type) {
//先將圖片按照頭像大小進行縮放再裁剪
Bitmap dstBitmap = Bitmap.createScaledBitmap(bitmap, width, height, false);
int bitmapWidth = dstBitmap.getWidth();
int bitmapHeight = dstBitmap.getHeight();
Bitmap newBitmap = null;
switch (type) {
case ClipType.CLIP_TYPE_HALF_CENTER:
newBitmap = Bitmap.createBitmap(dstBitmap, bitmapWidth / 4, 0, bitmapWidth / 2, bitmapHeight);
break;
case ClipType.CLIP_TYPE_ONE_QUARTER:
newBitmap = Bitmap.createBitmap(dstBitmap, bitmapWidth / 4, bitmapHeight / 4, bitmapWidth / 2,
bitmapHeight / 2);
break;
default:
newBitmap = dstBitmap;
break;
}
return newBitmap;
}
protected abstract void setDividerLocation();
public void drawDividers(int lineWidth, int color) {
setDividerLocation();
paint.setStyle(Paint.Style.FILL);
paint.setStrokeWidth(lineWidth);
paint.setColor(color);
if (dividers.length > 0) {
canvas.drawLines(dividers, paint);
}
}
}
DrawCircleAvatarItem
public class DrawCircleAvatarItem extends DrawAvatarItem {
public DrawCircleAvatarItem(Canvas canvas, Paint paint, int width, int height, List<Object> headObjList, int
dividerWidth, int textBg, int textSize, int textColor) {
super(canvas, paint, width, height, headObjList, dividerWidth, textBg, textSize, textColor);
}
@Override
protected void draw() {
switch (itemCount) {
case 1:
drawItem(ItemType.ITEM_TYPE_NORMAL, headObjList.get(0), ClipType.CLIP_TYPE_NO_);
break;
case 2:
drawItem(ItemType.ITEM_TYPE_LEFT, headObjList.get(0), ClipType.CLIP_TYPE_HALF_CENTER);
drawItem(ItemType.ITEM_TYPE_RIGHT, headObjList.get(1), ClipType.CLIP_TYPE_HALF_CENTER);
break;
case 3:
drawItem(ItemType.ITEM_TYPE_LEFT, headObjList.get(0), ClipType.CLIP_TYPE_HALF_CENTER);
drawItem(ItemType.ITEM_TYPE_RIGHT_TOP, headObjList.get(1), ClipType.CLIP_TYPE_ONE_QUARTER);
drawItem(ItemType.ITEM_TYPE_RIGHT_BOTTOM, headObjList.get(2), ClipType.CLIP_TYPE_ONE_QUARTER);
break;
case 4:
drawItem(ItemType.ITEM_TYPE_LEFT_TOP, headObjList.get(0), ClipType.CLIP_TYPE_ONE_QUARTER);
drawItem(ItemType.ITEM_TYPE_LEFT_BOTTOM, headObjList.get(1), ClipType.CLIP_TYPE_ONE_QUARTER);
drawItem(ItemType.ITEM_TYPE_RIGHT_TOP, headObjList.get(2), ClipType.CLIP_TYPE_ONE_QUARTER);
drawItem(ItemType.ITEM_TYPE_RIGHT_BOTTOM, headObjList.get(3), ClipType.CLIP_TYPE_ONE_QUARTER);
break;
}
if (itemCount > 4) {
drawItem(ItemType.ITEM_TYPE_LEFT_TOP, headObjList.get(0), ClipType.CLIP_TYPE_ONE_QUARTER);
drawItem(ItemType.ITEM_TYPE_LEFT_BOTTOM, headObjList.get(1), ClipType.CLIP_TYPE_ONE_QUARTER);
drawItem(ItemType.ITEM_TYPE_RIGHT_TOP, headObjList.get(2), ClipType.CLIP_TYPE_ONE_QUARTER);
drawItem(ItemType.ITEM_TYPE_RIGHT_BOTTOM, headObjList.get(3), ClipType.CLIP_TYPE_ONE_QUARTER);
}
}
@Override
protected void drawItem(int itemType, Object object, @ClipType int clipType) {
Rect dst = null;
int halfDivider = dividerWidth / 2;
switch (itemType) {
case ItemType.ITEM_TYPE_NORMAL:
dst = new Rect(0, 0, width, height);
break;
case ItemType.ITEM_TYPE_LEFT:
dst = new Rect(0, 0, width / 2 - halfDivider, height);
break;
case ItemType.ITEM_TYPE_RIGHT:
dst = new Rect(width / 2 + halfDivider, 0, width, height);
break;
case ItemType.ITEM_TYPE_LEFT_TOP:
dst = new Rect(0, 0, width / 2 - halfDivider, height / 2 - halfDivider);
break;
case ItemType.ITEM_TYPE_LEFT_BOTTOM:
dst = new Rect(0, height / 2 + halfDivider, width / 2 - halfDivider, height);
break;
case ItemType.ITEM_TYPE_RIGHT_TOP:
dst = new Rect(width / 2 + halfDivider, 0, width, height / 2 - halfDivider);
break;
case ItemType.ITEM_TYPE_RIGHT_BOTTOM:
dst = new Rect(width / 2 + halfDivider, height / 2 + halfDivider, width, height);
break;
}
drawItem(object, dst, clipType);
}
@Override
protected void setDividerLocation() {
switch (itemCount) {
case 1:
break;
case 2:
dividers = new float[4];
dividers[0] = width / 2;
dividers[1] = 0;
dividers[2] = width / 2;
dividers[3] = height;
break;
case 3:
dividers = new float[8];
dividers[0] = width / 2;
dividers[1] = 0;
dividers[2] = width / 2;
dividers[3] = height;
dividers[4] = width / 2;
dividers[5] = height / 2;
dividers[6] = width;
dividers[7] = height / 2;
break;
case 4:
dividers = new float[8];
dividers[0] = width / 2;
dividers[1] = 0;
dividers[2] = width / 2;
dividers[3] = height;
dividers[4] = 0;
dividers[5] = height / 2;
dividers[6] = width;
dividers[7] = height / 2;
break;
}
if (itemCount > 4) {
dividers = new float[8];
dividers[0] = width / 2;
dividers[1] = 0;
dividers[2] = width / 2;
dividers[3] = height;
dividers[4] = 0;
dividers[5] = height / 2;
dividers[6] = width;
dividers[7] = height / 2;
}
}
}
DrawRectangleAvatarItem
public class DrawRectangleAvatarItem extends DrawAvatarItem {
public DrawRectangleAvatarItem(Canvas canvas, Paint paint, int width, int height, List<Object> headObjList, int
dividerWidth, int textBg, int textSize, int textColor) {
super(canvas, paint, width, height, headObjList, dividerWidth, textBg, textSize, textColor);
}
public class ItemType extends DrawAvatarItem.ItemType {
public static final int ITEM_TYPE_TOP_CENTER = 7;
public static final int ITEM_TYPE_MIDDLE_LEFT = 8;
public static final int ITEM_TYPE_MIDDLE_RIGHT = 9;
public static final int ITEM_TYPE_MIDDLE_TOP_LEFT = 10;
public static final int ITEM_TYPE_MIDDLE_TOP_CENTER = 11;
public static final int ITEM_TYPE_MIDDLE_TOP_RIGHT = 12;
public static final int ITEM_TYPE_MIDDDLE_BOTTOME_LEFT = 13;
public static final int ITEM_TYPE_MIDDDLE_BOTTOME_CENTER = 14;
public static final int ITEM_TYPE_MIDDDLE_BOTTOME_RIGHT = 15;
public static final int ITEM_TYPE_GRID_TOP_LEFT = 16;
public static final int ITEM_TYPE_GRID_TOP_CENTER = 17;
public static final int ITEM_TYPE_GRID_TOP_RIGHT = 18;
public static final int ITEM_TYPE_GRID_MIDDLE_LEFT = 19;
public static final int ITEM_TYPE_GRID_MIDDLE_CENTER = 20;
public static final int ITEM_TYPE_GRID_MIDDLE_RIGHT = 21;
public static final int ITEM_TYPE_GRID_BOTTOME_LEFT = 22;
public static final int ITEM_TYPE_GRID_BOTTOME_CENTER = 23;
public static final int ITEM_TYPE_GRID_BOTTOME_RIGHT = 24;
public static final int ITEM_TYPE_GRID_TOP_CENTER_LEFT = 25;
public static final int ITEM_TYPE_GRID_TOP_CENTER_RIGHT = 26;
}
@Override
protected void draw() {
switch (itemCount) {
case 1:
drawItem(ItemType.ITEM_TYPE_NORMAL, headObjList.get(0), ClipType.CLIP_TYPE_NO_);
break;
case 2:
drawItem(ItemType.ITEM_TYPE_LEFT, headObjList.get(0), ClipType.CLIP_TYPE_NO_);
drawItem(ItemType.ITEM_TYPE_RIGHT, headObjList.get(1), ClipType.CLIP_TYPE_NO_);
break;
case 3:
drawItem(ItemType.ITEM_TYPE_TOP_CENTER, headObjList.get(0), ClipType.CLIP_TYPE_NO_);
drawItem(DrawAvatarItem.ItemType.ITEM_TYPE_LEFT_BOTTOM, headObjList.get(1), ClipType.CLIP_TYPE_NO_);
drawItem(DrawAvatarItem.ItemType.ITEM_TYPE_RIGHT_BOTTOM, headObjList.get(2), ClipType.CLIP_TYPE_NO_);
break;
case 4:
drawItem(DrawAvatarItem.ItemType.ITEM_TYPE_LEFT_TOP, headObjList.get(0), ClipType.CLIP_TYPE_NO_);
drawItem(DrawAvatarItem.ItemType.ITEM_TYPE_LEFT_BOTTOM, headObjList.get(1), ClipType.CLIP_TYPE_NO_);
drawItem(DrawAvatarItem.ItemType.ITEM_TYPE_RIGHT_TOP, headObjList.get(2), ClipType.CLIP_TYPE_NO_);
drawItem(DrawAvatarItem.ItemType.ITEM_TYPE_RIGHT_BOTTOM, headObjList.get(3), ClipType.CLIP_TYPE_NO_);
break;
case 5:
drawItem(ItemType.ITEM_TYPE_MIDDLE_LEFT, headObjList.get(0), ClipType.CLIP_TYPE_NO_);
drawItem(ItemType.ITEM_TYPE_MIDDLE_RIGHT, headObjList.get(1), ClipType.CLIP_TYPE_NO_);
drawItem(ItemType.ITEM_TYPE_MIDDDLE_BOTTOME_LEFT, headObjList.get(2), ClipType.CLIP_TYPE_NO_);
drawItem(ItemType.ITEM_TYPE_MIDDDLE_BOTTOME_CENTER, headObjList.get(3), ClipType.CLIP_TYPE_NO_);
drawItem(ItemType.ITEM_TYPE_MIDDDLE_BOTTOME_RIGHT, headObjList.get(4), ClipType.CLIP_TYPE_NO_);
break;
case 6:
drawItem(ItemType.ITEM_TYPE_MIDDLE_TOP_LEFT, headObjList.get(0), ClipType.CLIP_TYPE_NO_);
drawItem(ItemType.ITEM_TYPE_MIDDLE_TOP_CENTER, headObjList.get(1), ClipType.CLIP_TYPE_NO_);
drawItem(ItemType.ITEM_TYPE_MIDDLE_TOP_RIGHT, headObjList.get(2), ClipType.CLIP_TYPE_NO_);
drawItem(ItemType.ITEM_TYPE_MIDDDLE_BOTTOME_LEFT, headObjList.get(3), ClipType.CLIP_TYPE_NO_);
drawItem(ItemType.ITEM_TYPE_MIDDDLE_BOTTOME_CENTER, headObjList.get(4), ClipType.CLIP_TYPE_NO_);
drawItem(ItemType.ITEM_TYPE_MIDDDLE_BOTTOME_RIGHT, headObjList.get(5), ClipType.CLIP_TYPE_NO_);
break;
case 7:
drawItem(ItemType.ITEM_TYPE_GRID_TOP_CENTER, headObjList.get(0), ClipType.CLIP_TYPE_NO_);
drawItem(ItemType.ITEM_TYPE_GRID_MIDDLE_LEFT, headObjList.get(1), ClipType.CLIP_TYPE_NO_);
drawItem(ItemType.ITEM_TYPE_GRID_MIDDLE_CENTER, headObjList.get(2), ClipType.CLIP_TYPE_NO_);
drawItem(ItemType.ITEM_TYPE_GRID_MIDDLE_RIGHT, headObjList.get(3), ClipType.CLIP_TYPE_NO_);
drawItem(ItemType.ITEM_TYPE_GRID_BOTTOME_LEFT, headObjList.get(4), ClipType.CLIP_TYPE_NO_);
drawItem(ItemType.ITEM_TYPE_GRID_BOTTOME_CENTER, headObjList.get(5), ClipType.CLIP_TYPE_NO_);
drawItem(ItemType.ITEM_TYPE_GRID_BOTTOME_RIGHT, headObjList.get(6), ClipType.CLIP_TYPE_NO_);
break;
case 8:
drawItem(ItemType.ITEM_TYPE_GRID_TOP_CENTER_LEFT, headObjList.get(0), ClipType.CLIP_TYPE_NO_);
drawItem(ItemType.ITEM_TYPE_GRID_TOP_CENTER_RIGHT, headObjList.get(1), ClipType.CLIP_TYPE_NO_);
drawItem(ItemType.ITEM_TYPE_GRID_MIDDLE_LEFT, headObjList.get(2), ClipType.CLIP_TYPE_NO_);
drawItem(ItemType.ITEM_TYPE_GRID_MIDDLE_CENTER, headObjList.get(3), ClipType.CLIP_TYPE_NO_);
drawItem(ItemType.ITEM_TYPE_GRID_MIDDLE_RIGHT, headObjList.get(4), ClipType.CLIP_TYPE_NO_);
drawItem(ItemType.ITEM_TYPE_GRID_BOTTOME_LEFT, headObjList.get(5), ClipType.CLIP_TYPE_NO_);
drawItem(ItemType.ITEM_TYPE_GRID_BOTTOME_CENTER, headObjList.get(6), ClipType.CLIP_TYPE_NO_);
drawItem(ItemType.ITEM_TYPE_GRID_BOTTOME_RIGHT, headObjList.get(7), ClipType.CLIP_TYPE_NO_);
break;
case 9:
drawItem(ItemType.ITEM_TYPE_GRID_TOP_LEFT, headObjList.get(0), ClipType.CLIP_TYPE_NO_);
drawItem(ItemType.ITEM_TYPE_GRID_TOP_CENTER, headObjList.get(1), ClipType.CLIP_TYPE_NO_);
drawItem(ItemType.ITEM_TYPE_GRID_TOP_RIGHT, headObjList.get(2), ClipType.CLIP_TYPE_NO_);
drawItem(ItemType.ITEM_TYPE_GRID_MIDDLE_LEFT, headObjList.get(3), ClipType.CLIP_TYPE_NO_);
drawItem(ItemType.ITEM_TYPE_GRID_MIDDLE_CENTER, headObjList.get(4), ClipType.CLIP_TYPE_NO_);
drawItem(ItemType.ITEM_TYPE_GRID_MIDDLE_RIGHT, headObjList.get(5), ClipType.CLIP_TYPE_NO_);
drawItem(ItemType.ITEM_TYPE_GRID_BOTTOME_LEFT, headObjList.get(6), ClipType.CLIP_TYPE_NO_);
drawItem(ItemType.ITEM_TYPE_GRID_BOTTOME_CENTER, headObjList.get(7), ClipType.CLIP_TYPE_NO_);
drawItem(ItemType.ITEM_TYPE_GRID_BOTTOME_RIGHT, headObjList.get(8), ClipType.CLIP_TYPE_NO_);
break;
}
}
@Override
protected void drawItem(int itemType, Object object, int clipType) {
Rect dst = null;
int halfDivider = dividerWidth / 2;
switch (itemType) {
case ItemType.ITEM_TYPE_NORMAL:
dst = new Rect(0, 0, width, height);
break;
case ItemType.ITEM_TYPE_LEFT:
dst = new Rect(0, height / 4, width / 2 - halfDivider, height - height / 4);
break;
case ItemType.ITEM_TYPE_RIGHT:
dst = new Rect(width / 2 + halfDivider, height / 4, width, height - height / 4);
break;
case ItemType.ITEM_TYPE_LEFT_TOP:
dst = new Rect(0, 0, width / 2 - halfDivider, height / 2 - halfDivider);
break;
case ItemType.ITEM_TYPE_LEFT_BOTTOM:
dst = new Rect(0, height / 2 + halfDivider, width / 2 + halfDivider, height);
break;
case ItemType.ITEM_TYPE_RIGHT_TOP:
dst = new Rect(width / 2 + halfDivider, 0, width, height / 2 - halfDivider);
break;
case ItemType.ITEM_TYPE_RIGHT_BOTTOM:
dst = new Rect(width / 2 + halfDivider, height / 2 + halfDivider, width, height);
break;
case ItemType.ITEM_TYPE_TOP_CENTER:
dst = new Rect(width / 4, 0, width - width / 4, height / 2);
break;
case ItemType.ITEM_TYPE_MIDDLE_LEFT:
dst = new Rect(width / 6, height / 6, width / 3 + width / 6 - halfDivider, height / 6 + height / 3);
break;
case ItemType.ITEM_TYPE_MIDDLE_RIGHT:
dst = new Rect(width / 3 + width / 6 + halfDivider, height / 6, width - width / 6, height / 6 +
height / 3);
break;
case ItemType.ITEM_TYPE_MIDDLE_TOP_LEFT:
dst = new Rect(0, height / 6, width / 3 - halfDivider, height / 6 + height / 3);
break;
case ItemType.ITEM_TYPE_MIDDLE_TOP_CENTER:
dst = new Rect(width / 3 + halfDivider, height / 6, width / 3 * 2 - halfDivider, height / 6 + height
/ 3);
break;
case ItemType.ITEM_TYPE_MIDDLE_TOP_RIGHT:
dst = new Rect(width / 3 * 2 + halfDivider, height / 6, width, height / 6 + height / 3);
break;
case ItemType.ITEM_TYPE_MIDDDLE_BOTTOME_LEFT:
dst = new Rect(0, height / 6 + height / 3, width / 3 - halfDivider, height - height / 6);
break;
case ItemType.ITEM_TYPE_MIDDDLE_BOTTOME_CENTER:
dst = new Rect(width / 3 + halfDivider, height / 6 + height / 3, width / 3 * 2 - halfDivider, height
- height / 6);
break;
case ItemType.ITEM_TYPE_MIDDDLE_BOTTOME_RIGHT:
dst = new Rect(width / 3 * 2 + halfDivider, height / 6 + height / 3, width, height - height / 6);
break;
case ItemType.ITEM_TYPE_GRID_TOP_LEFT:
dst = new Rect(0, 0, width / 3 - halfDivider, height / 3 - halfDivider);
break;
case ItemType.ITEM_TYPE_GRID_TOP_CENTER:
dst = new Rect(width / 3 + halfDivider, 0, width / 3 * 2 - halfDivider, height / 3 - halfDivider);
break;
case ItemType.ITEM_TYPE_GRID_TOP_RIGHT:
dst = new Rect(width / 3 * 2 + halfDivider, 0, width, height / 3 - halfDivider);
break;
case ItemType.ITEM_TYPE_GRID_MIDDLE_LEFT:
dst = new Rect(0, height / 3 + halfDivider, width / 3 - halfDivider, height / 3 * 2 - halfDivider);
break;
case ItemType.ITEM_TYPE_GRID_MIDDLE_CENTER:
dst = new Rect(width / 3 + halfDivider, height / 3 + halfDivider, width / 3 * 2 - halfDivider, height
/ 3 * 2 - halfDivider);
break;
case ItemType.ITEM_TYPE_GRID_MIDDLE_RIGHT:
dst = new Rect(width / 3 * 2 + halfDivider, height / 3 + halfDivider, width, height / 3 * 2 -
halfDivider);
break;
case ItemType.ITEM_TYPE_GRID_BOTTOME_LEFT:
dst = new Rect(0, height / 3 * 2 + halfDivider, width / 3 - halfDivider, height);
break;
case ItemType.ITEM_TYPE_GRID_BOTTOME_CENTER:
dst = new Rect(width / 3 + halfDivider, height / 3 * 2 + halfDivider, width / 3 * 2 - halfDivider,
height);
break;
case ItemType.ITEM_TYPE_GRID_BOTTOME_RIGHT:
dst = new Rect(width / 3 * 2 + halfDivider, height / 3 * 2 + halfDivider, width, height);
break;
case ItemType.ITEM_TYPE_GRID_TOP_CENTER_LEFT:
dst = new Rect(width / 6, 0, width / 6 + width / 3 - halfDivider, height / 3);
break;
case ItemType.ITEM_TYPE_GRID_TOP_CENTER_RIGHT:
dst = new Rect(width / 6 + width / 3 + halfDivider, 0, width - width / 6, height / 3);
break;
}
drawItem(object, dst, clipType);
}
@Override
protected void setDividerLocation() {
switch (itemCount) {
case 1:
break;
case 2:
dividers = new float[4];
dividers[0] = width / 2;
dividers[1] = height / 4;
dividers[2] = width / 2;
dividers[3] = height / 2 + height / 4;
break;
case 3:
dividers = new float[8];
dividers[0] = 0;
dividers[1] = height / 2;
dividers[2] = width;
dividers[3] = height / 2;
dividers[4] = width / 2;
dividers[5] = height / 2;
dividers[6] = width / 2;
dividers[7] = height;
break;
case 4:
dividers = new float[8];
dividers[0] = width / 2;
dividers[1] = 0;
dividers[2] = width / 2;
dividers[3] = height;
dividers[4] = 0;
dividers[5] = height / 2;
dividers[6] = width;
dividers[7] = height / 2;
break;
case 5:
dividers = new float[16];
dividers[0] = width / 2;
dividers[1] = height / 6;
dividers[2] = width / 2;
dividers[3] = height / 6 + height / 3;
dividers[4] = 0;
dividers[5] = height / 2;
dividers[6] = width;
dividers[7] = height / 2;
dividers[8] = width / 3;
dividers[9] = height / 2;
dividers[10] = width / 3;
dividers[11] = height / 2 + height / 3;
dividers[12] = width / 3 * 2;
dividers[13] = height / 2;
dividers[14] = width / 3 * 2;
dividers[15] = height / 2 + height / 3;
break;
case 6:
dividers = new float[12];
dividers[0] = 0;
dividers[1] = height / 2;
dividers[2] = width;
dividers[3] = height / 2;
dividers[4] = width / 3;
dividers[5] = height / 6;
dividers[6] = width / 3;
dividers[7] = height - height / 6;
dividers[8] = width / 3 * 2;
dividers[9] = height / 6;
dividers[10] = width / 3 * 2;
dividers[11] = height - height / 6;
break;
case 7:
dividers = new float[16];
dividers[0] = width / 3;
dividers[1] = height / 3;
dividers[2] = width / 3;
dividers[3] = height;
dividers[4] = width / 3 * 2;
dividers[5] = height / 3;
dividers[6] = width / 3 * 2;
dividers[7] = height;
dividers[8] = 0;
dividers[9] = height / 3;
dividers[10] = width;
dividers[11] = height / 3;
dividers[12] = 0;
dividers[13] = height / 3 * 2;
dividers[14] = width;
dividers[15] = height / 3 * 2;
break;
case 8:
dividers = new float[20];
dividers[0] = width / 2;
dividers[1] = 0;
dividers[2] = width / 2;
dividers[3] = height / 3;
dividers[4] = width / 3;
dividers[5] = height / 3;
dividers[6] = width / 3;
dividers[7] = height;
dividers[8] = width / 3 * 2;
dividers[9] = height / 3;
dividers[10] = width / 3 * 2;
dividers[11] = height;
dividers[12] = 0;
dividers[13] = height / 3;
dividers[14] = width;
dividers[15] = height / 3;
dividers[16] = 0;
dividers[17] = height / 3 * 2;
dividers[18] = width;
dividers[19] = height / 3 * 2;
break;
case 9:
dividers = new float[16];
dividers[0] = width / 3;
dividers[1] = 0;
dividers[2] = width / 3;
dividers[3] = height;
dividers[4] = width / 3 * 2;
dividers[5] = 0;
dividers[6] = width / 3 * 2;
dividers[7] = height;
dividers[8] = 0;
dividers[9] = height / 3;
dividers[10] = width;
dividers[11] = height / 3;
dividers[12] = 0;
dividers[13] = height / 3 * 2;
dividers[14] = width;
dividers[15] = height / 3 * 2;
break;
}
}
}
使用
<com.text.demo.spanablestring.roundimg.AvatarImageView
android:id="@+id/avatarImg"
android:layout_width="300dp"
android:layout_height="300dp"
app:avatarMargin="5dp"
app:avatarType="rectangle"
app:bgColor="@color/gray"
app:roundCorner="5dp"
app:showDivider="true"
app:textBg="@android:color/holo_blue_dark"
app:textColor="@color/white"
app:textSize="20sp" />
private void setAvatar() {
Object[] avatarArray = new Object[]{R.drawable.head_1, R.drawable.head_2, "阿森", R.drawable.head_3, R.drawable
.head_4, R.drawable.head_5, "欣欣", R.drawable.head_6, "一一"};
// int[] avatarArray = new int[]{R.drawable.head_1, R.drawable.head_2, R.drawable.head_3, R.drawable.head_4};
int[] avatarArray2 = new int[]{R.drawable.head_1, R.drawable.head_2, R.drawable.head_3, R.drawable.head_4, R
.drawable.head_5, R.drawable.head_6, R.drawable.head_7, R.drawable.head_8, R.drawable.head_9};
List<Object> list = new ArrayList<>();
for (int i = 0; i < avatarArray.length; i++) {
list.add(avatarArray[i]);
}
avatarImg.setHeadObjList(list);
}
效果圖: