为什么80%的码农都做不了架构师?>>>
最近在一个QQ群里,看到有人在做一个需求,要能实现头像的聚合拼接,我本来是想的生成一个bitmap,有人说起来要用drawable实现,其实算法是一样的,只是用法不一样而已,我就顺便学一下自定义drawable来做。
先看效果:
就是这样了,思路应该就是一个圆形的imageview,加载上对应的bitmap或者drawable即可。
drawable的代码如下:
public class SliceDrawable extends Drawable {private List<Bitmap> src ;private Paint paint;public SliceDrawable(List<Bitmap> srcs) {if (srcs == null || srcs.size() == 0){throw new IllegalStateException("bitmaps cannot be null or empty");}src = srcs;paint = new Paint();paint.setAntiAlias(true);}@Overridepublic void draw(Canvas canvas) {Bitmap bitmap = null;Rect rect = getBounds();switch (src.size()){case 1:bitmap = src.get(0);canvas.drawBitmap(bitmap,getBitmapBound(bitmap),rect,paint);break;case 2:bitmap = src.get(0);canvas.drawBitmap(bitmap,getBitmapBound(bitmap),rect,paint);bitmap = src.get(1);canvas.drawBitmap(bitmap,getBitmapBound(bitmap),getRigtBitmapBound(),paint);break;case 3:bitmap = src.get(0);canvas.drawBitmap(bitmap,getBitmapBound(bitmap),rect,paint);bitmap = src.get(1);canvas.drawBitmap(bitmap,getBitmapBound(bitmap),getRightTopBound(),paint);bitmap = src.get(2);canvas.drawBitmap(bitmap,getBitmapBound(bitmap),getRightBottomBound(),paint);break;case 4:bitmap = src.get(0);canvas.drawBitmap(bitmap,getBitmapBound(bitmap),getLeftTopBound(),paint);bitmap = src.get(1);canvas.drawBitmap(bitmap,getBitmapBound(bitmap),getRightTopBound(),paint);bitmap = src.get(2);canvas.drawBitmap(bitmap,getBitmapBound(bitmap),getRightBottomBound(),paint);bitmap = src.get(3);canvas.drawBitmap(bitmap,getBitmapBound(bitmap),getLeftBottomBound(),paint);break;default://多于4张,那么平分绘图区域?break;}}private Rect getBitmapBound(Bitmap bitmap){return new Rect(0,0,bitmap.getWidth(),bitmap.getHeight());}private Rect getLeftTopBound(){Rect rect = getBounds();return new Rect(rect.left,rect.top,rect.centerX(),rect.centerY());}private Rect getRightTopBound(){Rect rect = getBounds();return new Rect(rect.centerX(),rect.top,rect.right,rect.centerY());}private Rect getRightBottomBound(){Rect rect = getBounds();return new Rect(rect.centerX(),rect.centerY(),rect.right,rect.bottom);}private Rect getLeftBottomBound(){Rect rect = getBounds();return new Rect(rect.left,rect.centerY(),rect.centerX(),rect.bottom);}private Rect getRigtBitmapBound(){Rect rect = getBounds();return new Rect(rect.centerX(),0,rect.right+rect.centerX(),rect.bottom);}@Overridepublic void setAlpha(int alpha) {}@Overridepublic void setColorFilter(ColorFilter colorFilter) {}@Overridepublic int getOpacity() {return 0;}
}
因为要求就是最多四张图片显示,所以更多的就没有写,如此加载到圆形的Imageview中即可达到上图的效果。