Android——仿钉钉,微信,QQ群头像

效果

在这里插入图片描述

功能

  • 生成类似钉钉、微信 群聊组合头像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);
    }

效果图:
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/u012230055/article/details/100524225