关于QQ群头像以及微信讨论组头像的工具类

QQ群头像以及微信讨论组头像工具类介绍

 介绍:

     由于段时间公司项目需求,在翻了网上很多代码后发现,很多人用的是自定义View的办法来实现此类头像的效果,但是,这样一来就必须改变项目中原有的控件,而且当需要将此图片内容传递到后台时,就会变的非常麻烦,所以我就从网上找了一个Demo来自己修改,将其变成了一个可以直接生成一张头像图片的工具类,这样一来无论你需要什么样的操作都会非常方便,可以将这张生成的图片随意设置,下面放几张项目的图片给各位看一下:

       下面是微信的讨论组头像展示:

    主要是用到了三个类:

     这里的JoinBitmaps主要是底层对该图片的一些剪裁等处理,JoinLayout是对头像中具体图片绘制时的参数进行设置,所以,这两个类其实是网上找的牛人写好的,TaolunBitmapUtils则是我对一些具体方法的封装,下面将贴出具体代码内容:

 

public class JoinBitmaps {public static final void join(Canvas canvas, int dimension, List<Bitmap> bitmaps) {if (bitmaps == null)return;int count = Math.min(bitmaps.size(), JoinLayout.max());float[] size = JoinLayout.size(count);join(canvas, dimension, bitmaps, count, size);}public static final void join(Canvas canvas, int dimension, List<Bitmap> bitmaps, int count,float[] size) {join(canvas, dimension, bitmaps, count, size, 0.15f);}public static final void join(Canvas canvas, int dimension, List<Bitmap> bitmaps,float gapSize) {if (bitmaps == null)return;int count = Math.min(bitmaps.size(), JoinLayout.max());float[] size = JoinLayout.size(count);join(canvas, dimension, bitmaps, count, size, gapSize);}public static final void join(Canvas canvas, int dimension, List<Bitmap> bitmaps, int count,float[] size, float gapSize) {if (bitmaps == null)return;// 旋转角度float[] rotation = JoinLayout.rotation(count);// paintPaint paint = new Paint();paint.setAntiAlias(true);Matrix matrixJoin = new Matrix();// scale as join sizematrixJoin.postScale(size[0], size[0]);canvas.save();// canvas.drawColor(Color.RED);// index<count bitmaps.size 可能会越界for (int index = 0; index < count; index++) {Bitmap bitmap = bitmaps.get(index);// MATRIXMatrix matrix = new Matrix();// scale as destinationmatrix.postScale((float) dimension / bitmap.getWidth(),(float) dimension / bitmap.getHeight());canvas.save();matrix.postConcat(matrixJoin);float[] offset = JoinLayout.offset(count, index, dimension, size);canvas.translate(offset[0], offset[1]);// 缩放Bitmap newBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),bitmap.getHeight(), matrix, true);// 裁剪Bitmap bitmapOk = createMaskBitmap(newBitmap, newBitmap.getWidth(),newBitmap.getHeight(), (int) rotation[index], gapSize);canvas.drawBitmap(bitmapOk, 0, 0, paint);canvas.restore();}canvas.restore();}public static final Bitmap createMaskBitmap(Bitmap bitmap, int viewBoxW, int viewBoxH,int rotation, float gapSize) {Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(),Bitmap.Config.ARGB_8888);Canvas canvas = new Canvas(output);final Paint paint = new Paint();paint.setAntiAlias(true);// 抗锯齿paint.setFilterBitmap(true);int center = Math.round(viewBoxW / 2f);canvas.drawCircle(center, center, center, paint);paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));canvas.drawBitmap(bitmap, 0, 0, paint);if (rotation != 360) {Matrix matrix = new Matrix();// 根据原图的中心位置旋转matrix.setRotate(rotation, viewBoxW / 2, viewBoxH / 2);canvas.setMatrix(matrix);paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));canvas.drawCircle(viewBoxW * (1.5f - gapSize), center, center, paint);}return output;}public static final Bitmap createBitmap(int width, int height, List<Bitmap> bitmaps) {int count = Math.min(bitmaps.size(), JoinLayout.max());float[] size = JoinLayout.size(count);return createBitmap(width, height, bitmaps, count, size, 0.15f);}public static final Bitmap createBitmap(int width, int height, List<Bitmap> bitmaps,int count, float[] size) {return createBitmap(width, height, bitmaps, count, size, 0.15f);}public static final Bitmap createBitmap(int width, int height, List<Bitmap> bitmaps,int count, float[] size, float gapSize) {Bitmap output = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);Canvas canvas = new Canvas(output);int dimen = Math.min(width, height);join(canvas, dimen, bitmaps, count, size, gapSize);return output;}}

  

public class JoinLayout {public static final String TAG = JoinLayout.class.getSimpleName();public static int max() {return 5;}private static final float[][] rotations = { new float[] { 360.0f }, new float[] { 45.0f, 360.0f },new float[] { 120.0f, 0.0f, -120.0f }, new float[] { 90.0f, 180.0f, -90.0f, 0.0f },new float[] { 144.0f, 72.0f, 0.0f, -72.0f, -144.0f }, };public static float[] rotation(int count) {return count > 0 && count <= rotations.length ? rotations[count - 1] : null;}//参数一:圆的半径private static final float[][] sizes = { new float[] { 0.92f, 0.9f },new float[] { 0.51f, 0.65f }, new float[] { 0.47f, 0.8f },new float[] { 0.43f, 0.91f }, new float[] { 0.38f, 0.80f } };public static float[] size(int count) {return count > 0 && count <= sizes.length ? sizes[count - 1] : null;}public static float[] offset(int count, int index, float dimension, float[] size) {switch (count) {case 1:return offset1(index, dimension, size);case 2:return offset2(index, dimension, size);case 3:return offset3(index, dimension, size);case 4:return offset4(index, dimension, size);case 5:return offset5(index, dimension, size);default:break;}return new float[] { 0f, 0f };}/*** 5个头像** @param index*            下标* @param dimension*            画布边长(正方形)* @param size*            size[0]缩放 size[1]边距* @return 下标index X,Y轴坐标*/private static float[] offset5(int index, float dimension, float[] size) {// 圆的直径float cd = (float) dimension * size[0];// 边距float s1 = -cd * size[1];float x1 = 0;float y1 = s1;float x2 = (float) (s1 * Math.cos(19 * Math.PI / 180));float y2 = (float) (s1 * Math.sin(18 * Math.PI / 180));float x3 = (float) (s1 * Math.cos(54 * Math.PI / 180));float y3 = (float) (-s1 * Math.sin(54 * Math.PI / 180));float x4 = (float) (-s1 * Math.cos(54 * Math.PI / 180));float y4 = (float) (-s1 * Math.sin(54 * Math.PI / 180));float x5 = (float) (-s1 * Math.cos(19 * Math.PI / 180));float y5 = (float) (s1 * Math.sin(18 * Math.PI / 180));// Log.d(TAG, "x1:" + x1 + "/y1:" + y1);// Log.d(TAG, "x2:" + x2 + "/y2:" + y2);// Log.d(TAG, "x3:" + x3 + "/y3:" + y3);// Log.d(TAG, "x4:" + x4 + "/y4:" + y4);// Log.d(TAG, "x5:" + x5 + "/y5:" + y5);// 居中 Y轴偏移量float xx1 = (dimension - cd - y3 - s1) / 2 * 0.91f;// 居中 X轴偏移量float xxc1 = (dimension - cd) / 2;// xx1 = xxc1 = -s1;// xx1 = xxc1 = 0;switch (index) {case 0:// return new float[] { s1 + xxc1, xx1 };return new float[] { x1 + xxc1, y1 + xx1 };case 1:return new float[] { x2 + xxc1, y2 + xx1 };case 2:return new float[] { x3 + xxc1, y3 + xx1 };case 3:return new float[] { x4 + xxc1, y4 + xx1 };case 4:return new float[] { x5 + xxc1, y5 + xx1 };default:break;}return new float[] { 0f, 0f };}/*** 4个头像** @param index*            下标* @param dimension*            画布边长(正方形)* @param size*            size[0]缩放 size[1]边距* @return 下标index X,Y轴坐标*/private static float[] offset4(int index, float dimension, float[] size) {// 圆的直径float cd = (float) dimension * size[0];// 边距float s1 = cd * size[1];float x1 = 0;float y1 = 0;float x2 = s1;float y2 = y1;float x3 = s1;float y3 = s1;float x4 = x1;float y4 = y3;// Log.d(TAG, "x1:" + x1 + "/y1:" + y1);// Log.d(TAG, "x2:" + x2 + "/y2:" + y2);// Log.d(TAG, "x3:" + x3 + "/y3:" + y3);// Log.d(TAG, "x4:" + x4 + "/y4:" + y4);// 居中 X轴偏移量float xx1 = (dimension - cd - s1) / 2;switch (index) {case 0:return new float[] { x1 + xx1, y1 + xx1 };case 1:return new float[] { x2 + xx1, y2 + xx1 };case 2:return new float[] { x3 + xx1, y3 + xx1 };case 3:return new float[] { x4 + xx1, y4 + xx1 };default:break;}return new float[] { 0f, 0f };}/*** 3个头像** @param index*            下标* @param dimension*            画布边长(正方形)* @param size*            size[0]缩放 size[1]边距* @return 下标index X,Y轴坐标*/private static float[] offset3(int index, float dimension, float[] size) {// 圆的直径float cd = (float) dimension * size[0];// 边距float s1 = cd * size[1];// 第二个圆的 Y坐标float y2 = s1 * (3 / 2);// 第二个圆的 X坐标float x2 = s1 - y2 / 1.73205f;// 第三个圆的 X坐标float x3 = s1 * 2 - x2;// 居中 Y轴偏移量float xx1 = (dimension - cd - y2) / 2 * 0.18f;// 居中 X轴偏移量float xxc1 = (dimension - cd) / 2 - s1;// xx1 = xxc1 = 0;switch (index) {case 0:return new float[] { s1 + xxc1, xx1 };case 1:return new float[] { x2 + xxc1, y2 + xx1 };case 2:return new float[] { x3 + xxc1, y2 + xx1 };default:break;}return new float[] { 0f, 0f };}/*** 2个头像** @param index*            下标* @param dimension*            画布边长(正方形)* @param size*            size[0]缩放 size[1]边距* @return 下标index X,Y轴坐标*/private static float[] offset2(int index, float dimension, float[] size) {// 圆的直径float cd = (float) dimension * size[0];// 边距float s1 = cd * size[1];float x1 = 0;float y1 = 0;float x2 = s1;float y2 = s1;// Log.d(TAG, "x1:" + x1 + "/y1:" + y1);// Log.d(TAG, "x2:" + x2 + "/y2:" + y2);// 居中 X轴偏移量float xx1 = (dimension - cd - s1) / 2;switch (index) {case 0:return new float[] { x1 + xx1, y1 + xx1 };case 1:return new float[] { x2 + xx1, y2 + xx1 };default:break;}return new float[] { 0f, 0f };}/*** 1个头像** @param index*            下标* @param dimension*            画布边长(正方形)* @param size*            size[0]缩放 size[1]边距* @return 下标index X,Y轴坐标*/private static float[] offset1(int index, float dimension, float[] size) {// 圆的直径float cd = (float) dimension * size[0];float offset = (dimension - cd) / 2;return new float[] { offset, offset };}
}


    最后就是我整理的一些方法,里面都有很详细的注解,相信各位都能看得明白。

public class TaolunBitmapUtils {private static Bitmap[] mbitmap;/**** @param tempWidth  最终图片的宽* @param tempHeight  最终图片的高* @param bitmaps    放入里面的图片集合,可放1-5个数量* @return   返回最终的Bitmap类型,并且是经过圆形剪裁的最终图片**  仿照QQ讨论组的头像,此方法的背景颜色已固定,可以在此代码修改*/public static Bitmap CircleTaolunBitmap(int tempWidth, int tempHeight, List<Bitmap> bitmaps){if(bitmaps.size()<1 && bitmaps.size() >5){return null;}Bitmap bitmap = bitmaps.get(0);if(bitmap == null){return null;}Bitmap canvasBitmap = Bitmap.createBitmap(tempWidth, tempHeight,Bitmap.Config.ARGB_8888);Canvas localCanvas = new Canvas(canvasBitmap);localCanvas.drawColor(Color.parseColor("#d1dedf"));JoinBitmaps.join(localCanvas, Math.min(tempWidth, tempHeight),bitmaps);return GetRoundedCornerBitmap(canvasBitmap);}/**** @param tempWidth   最终图片的宽* @param tempHeight  最终图片的高* @param bitmaps     放入里面的图片集合,可放1-5个数量* @param background  可以设定最终图的背景颜色* @return   返回最终的Bitmap类型,并且是经过圆形剪裁的最终图片** 仿QQ讨论组头像的方法,此方法的背景颜色可以修改*/public static Bitmap CircleTaolunBitmap(int tempWidth, int tempHeight, List<Bitmap> bitmaps,int background){//防止输入的集合为空if(bitmaps.size()<1 && bitmaps.size() >5){return null;}//取出第一张图片检验是否为空Bitmap bitmap = bitmaps.get(0);if(bitmap == null){return null;}Bitmap canvasBitmap = Bitmap.createBitmap(tempWidth, tempHeight,Bitmap.Config.ARGB_8888);Canvas localCanvas = new Canvas(canvasBitmap);localCanvas.drawColor(background);JoinBitmaps.join(localCanvas, Math.min(tempWidth, tempHeight),bitmaps);return GetRoundedCornerBitmap(canvasBitmap);}private static int padding = 2; /** 图片之间的距离 */private static int cornor = 0;/** 内部图片的圆角值 */private static Bitmap[] paramList ;/***    此方法是仿微信讨论组头像的制作方法** @param context 上下文对象* @param tempWidth 所显示最终图片的宽* @param tempHeight 所显示最终图片的高* @param bitmaps  内层图片存放的bitmap集合* @return   仿微信讨论组头像的最终图片bitmap*/public static Bitmap SquareTaolunzuBitmap(Context context,int tempWidth,int tempHeight,List<Bitmap> bitmaps){// 重置paddingpadding = 2;paramList = bitmaps.toArray(new Bitmap[bitmaps.size()]);if (paramList.length < 1 && paramList.length > 9) {return null;}// 先取一个获取宽和高Bitmap tempBitmap = (Bitmap) paramList[0];if (tempBitmap == null) {return null;}// 创建一个空格的bitmapBitmap canvasBitmap = Bitmap.createBitmap(tempWidth, tempHeight,Bitmap.Config.ARGB_8888);// 头像的数量int bitmapCount = paramList.length;Canvas localCanvas = new Canvas(canvasBitmap);localCanvas.drawColor(Color.parseColor("#d1dedf"));int colum = 0;if (bitmapCount > 1 && bitmapCount < 5) {colum = 2;} else if (bitmapCount > 4 && bitmapCount < 10) {colum = 3;} else {colum = 1;}float scale = 1.0F / colum;// 根据列数缩小Bitmap scaledBitmap = scaleBitmap(scale, tempBitmap);if (padding > 0) {padding = dip2px(context, padding);// 如果有内边距 再次缩小float paddingScale = (float) (tempWidth - (colum + 1) * padding)/ colum / scaledBitmap.getWidth();scaledBitmap = scaleBitmap(paddingScale, scaledBitmap);scale = scale * paddingScale;}// 第一行的 头像个数int topRowCount = bitmapCount % colum;// 满行的行数int rowCount = bitmapCount / colum;if (topRowCount > 0) {// 如果第一行头像个数大于零 行数加1rowCount++;} else if (topRowCount == 0) {// 6 或者 9 第一行头像个数和列数一致topRowCount = colum;}// 缩小后头像的宽int scaledWidth = scaledBitmap.getWidth();// 缩小后头像的高int scaledHeight = scaledBitmap.getHeight();// 第一个头像与画布顶部的距离int firstTop = ((tempHeight - (rowCount * scaledHeight + (rowCount + 1)* padding)) / 2)+ padding;// 第一个头像与画布左部的距离int firstLeft = ((tempWidth - (topRowCount * scaledWidth + (topRowCount + 1)* padding)) / 2)+ padding;for (int i = 0; i < paramList.length; i++) {if (i == 9) {// 达到上限 停止break;}// 按照最终压缩比例压缩Bitmap bit = scaleBitmap(scale, (Bitmap) paramList[i]);if (cornor > 0) {// 圆角化bit = GetRoundedCornerBitmap(bit);}localCanvas.drawBitmap(bit, firstLeft, firstTop, null);firstLeft += (scaledWidth + padding);if (i == topRowCount - 1 | tempWidth - firstLeft < scaledWidth) {firstTop += (scaledHeight + padding);firstLeft = padding;}bit.recycle();}// 重置padding// padding = 2;localCanvas.save(Canvas.ALL_SAVE_FLAG);localCanvas.restore();return canvasBitmap;}/***    此方法是可以修改背景的仿微信讨论组头像的制作方法** @param context 上下文对象* @param tempWidth 所显示最终图片的宽* @param tempHeight 所显示最终图片的高* @param bitmaps  内层图片存放的bitmap集合* @param background  可以修改头像的底层背景* @return   仿微信讨论组头像的最终图片bitmap*/public static Bitmap SquareTaolunzuBitmap(Context context,int tempWidth,int tempHeight,List<Bitmap> bitmaps,int background){// 重置paddingpadding = 2;paramList = bitmaps.toArray(new Bitmap[bitmaps.size()]);if (paramList.length < 1 && paramList.length > 9) {return null;}// 先取一个获取宽和高Bitmap tempBitmap = (Bitmap) paramList[0];if (tempBitmap == null) {return null;}// 创建一个空格的bitmapBitmap canvasBitmap = Bitmap.createBitmap(tempWidth, tempHeight,Bitmap.Config.ARGB_8888);// 头像的数量int bitmapCount = paramList.length;Canvas localCanvas = new Canvas(canvasBitmap);localCanvas.drawColor(background);int colum = 0;if (bitmapCount > 1 && bitmapCount < 5) {colum = 2;} else if (bitmapCount > 4 && bitmapCount < 10) {colum = 3;} else {colum = 1;}float scale = 1.0F / colum;// 根据列数缩小Bitmap scaledBitmap = scaleBitmap(scale, tempBitmap);if (padding > 0) {padding = dip2px(context, padding);// 如果有内边距 再次缩小float paddingScale = (float) (tempWidth - (colum + 1) * padding)/ colum / scaledBitmap.getWidth();scaledBitmap = scaleBitmap(paddingScale, scaledBitmap);scale = scale * paddingScale;}// 第一行的 头像个数int topRowCount = bitmapCount % colum;// 满行的行数int rowCount = bitmapCount / colum;if (topRowCount > 0) {// 如果第一行头像个数大于零 行数加1rowCount++;} else if (topRowCount == 0) {// 6 或者 9 第一行头像个数和列数一致topRowCount = colum;}// 缩小后头像的宽int scaledWidth = scaledBitmap.getWidth();// 缩小后头像的高int scaledHeight = scaledBitmap.getHeight();// 第一个头像与画布顶部的距离int firstTop = ((tempHeight - (rowCount * scaledHeight + (rowCount + 1)* padding)) / 2)+ padding;// 第一个头像与画布左部的距离int firstLeft = ((tempWidth - (topRowCount * scaledWidth + (topRowCount + 1)* padding)) / 2)+ padding;for (int i = 0; i < paramList.length; i++) {if (i == 9) {// 达到上限 停止break;}// 按照最终压缩比例压缩Bitmap bit = scaleBitmap(scale, (Bitmap) paramList[i]);if (cornor > 0) {// 圆角化bit = GetRoundedCornerBitmap(bit);}localCanvas.drawBitmap(bit, firstLeft, firstTop, null);firstLeft += (scaledWidth + padding);if (i == topRowCount - 1 | tempWidth - firstLeft < scaledWidth) {firstTop += (scaledHeight + padding);firstLeft = padding;}bit.recycle();}// 重置padding//padding = 2;localCanvas.save(Canvas.ALL_SAVE_FLAG);localCanvas.restore();return canvasBitmap;}//绘制仿微信讨论组头像内部头像的重新剪裁图片bitmap    按比例缩放图片private static Bitmap scaleBitmap(float paramFloat, Bitmap paramBitmap) {Matrix localMatrix = new Matrix();localMatrix.postScale(paramFloat, paramFloat);//找出内部图片的最短距离,以这个长度来进行重新绘制得到正方形图片int chang = Math.min(paramBitmap.getWidth(), paramBitmap.getHeight());return Bitmap.createBitmap(paramBitmap, 0, 0,chang ,chang, localMatrix, true);}//此方法用于仿微信讨论组头像的尺寸转换   即转换为设备独立像素dipprivate static int dip2px(Context context, float value) {return (int) (TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,value, context.getResources().getDisplayMetrics()) + 0.5f);}/***    将图片剪裁成圆形的工具类* @param bitmap   传入一张图片  bitmap* @return    返回此图片裁剪成圆形之后的bitmap*/private static Bitmap GetRoundedCornerBitmap(Bitmap bitmap) {try {Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(), Bitmap.Config.ARGB_8888);Canvas canvas = new Canvas(output);final Paint paint = new Paint();final Rect rect = new Rect(0, 0, bitmap.getWidth(),bitmap.getHeight());final RectF rectF = new RectF(new Rect(0, 0, bitmap.getWidth(),bitmap.getHeight()));paint.setAntiAlias(true);canvas.drawARGB(0, 0, 0, 0);paint.setColor(Color.BLACK);int width = bitmap.getWidth();int height = bitmap.getHeight();int cornor = Math.min(width,height);canvas.drawRoundRect(rectF, cornor, cornor, paint);paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));final Rect src = new Rect(0, 0, bitmap.getWidth(),bitmap.getHeight());canvas.drawBitmap(bitmap, src, rect, paint);return output;} catch (Exception e) {return bitmap;}}}


使用:     

当然,最后免不了讲一下使用的步骤:

1.将这三个工具类放到自己项目的文件夹下面;

2.在需要的地方调用相应的方法来生成一张Bitmap;


          2.1qq群头像使用示例:

  private ImageView[] name =new ImageView[id.length];private List<Bitmap> qq = new ArrayList<>();//作为QQ群头像的数据源
 //QQ3个头像Bitmap bitmap4 = BitmapFactory.decodeResource(getResources(),R.mipmap.a1);Bitmap bitmap5 = BitmapFactory.decodeResource(getResources(),R.mipmap.a2);Bitmap bitmap6 = BitmapFactory.decodeResource(getResources(),R.mipmap.a3);qq.clear();qq.add(bitmap4);qq.add(bitmap5);qq.add(bitmap6);Bitmap data2 = TaolunBitmapUtils.CircleTaolunBitmap(150,150,qq);name[2].setImageBitmap(data2);//改变头像背景Bitmap datas2 = TaolunBitmapUtils.CircleTaolunBitmap(150,150,qq, Color.parseColor("#cc805f"));name[7].setImageBitmap(datas2);
这里是生成一张具有三个头像的图片例子,这里需要特别注意的是,TaolunBitmapUtils这个类中所有的方法都是需要给一个Bitmap类型的List集合,之后,相应的方法中会自动将集合里面的Bitmap取出来制作成一张头像图片。例如,这里的CircleTaolunBitmap()方法中的最后一个参数qq就是已经写好的Bitmap集合,最终返回的这张Bitmap就是你所需要的图片了,在这里我将它放在了ImageView上面,至于下面的4个参数的CircleTaolunBitmap()中最后一个参数是设置的整个图片的背景色,需要的可以在这里自由设置。



       2.2微信讨论组头像使用示例
   private ImageView[] name =new ImageView[id.length];private List<Bitmap> wx = new ArrayList<>();//作为微信讨论组头像的数据源

        Bitmap bitmap91 = BitmapFactory.decodeResource(getResources(),R.mipmap.a1);Bitmap bitmap92 = BitmapFactory.decodeResource(getResources(),R.mipmap.a2);Bitmap bitmap93 = BitmapFactory.decodeResource(getResources(),R.mipmap.a3);Bitmap bitmap94 = BitmapFactory.decodeResource(getResources(),R.mipmap.a4);Bitmap bitmap95 = BitmapFactory.decodeResource(getResources(),R.mipmap.a5);Bitmap bitmap96 = BitmapFactory.decodeResource(getResources(),R.mipmap.a6);Bitmap bitmap97 = BitmapFactory.decodeResource(getResources(),R.mipmap.a1);Bitmap bitmap98 = BitmapFactory.decodeResource(getResources(),R.mipmap.a2);Bitmap bitmap99 = BitmapFactory.decodeResource(getResources(),R.mipmap.a3);wx.clear();wx.add(bitmap91);wx.add(bitmap92);wx.add(bitmap93);wx.add(bitmap94);wx.add(bitmap95);wx.add(bitmap96);wx.add(bitmap97);wx.add(bitmap98);wx.add(bitmap99);Bitmap data9 = TaolunBitmapUtils.SquareTaolunzuBitmap(this,170,170,wx);name[2].setImageBitmap(data9);//改变头像背景Bitmap datas9 = TaolunBitmapUtils.SquareTaolunzuBitmap(this,170,170,wx, Color.parseColor("#a45d97"));name[5].setImageBitmap(datas9);

     这里是设置微信头像的例子,原理还是跟上面一样,主要调用的是SquareTaolunzuBitmap()这个方法了,第一个参数环境变量,第二三个参数分别是宽跟高,最后一个参数同样是Bitmap类型的List集合,倒数第二行的代码中,多的那一个参数也是对背景颜色的设置,供给这方面有所需要的童鞋们使用。

总结:

基本的介绍就到这里为止了,如果还有不明白的地方可以参考下面的链接中的Demo,里面我都尽可能详细地加了很多注解,而且,三个页面都是最简单的方式进行呈现的,或者还可以私信我,虽然不常常上线,但是在看到的时候会尽快回复的。

最后,如果哪里还有不好的地方请各位及时指出,我也会尽力改正的!

关于QQ群头像以及微信讨论组头像的工具类下载链接: http://download.csdn.net/download/yu537476/9955248
关于QQ群头像以及微信讨论组头像的工具类Demo链接: http://download.csdn.net/download/yu537476/9955253   Github地址: https://github.com/byb-software/TaolunBitmapUtils.git

        原创内容请勿随意转载!

  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/29484.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

桌面宠物!

电脑桌宠&#xff1a; 天选姬 下载地址&#xff1a;https://www.asus.com.cn/supportonly/FA506QR/HelpDesk_download/ 选择系统&#xff0c;点击软件程序下的查看更多&#xff0c;选择天选姬桌面大鹅&#xff08;Desktop Goose&#xff09; 下载地址&#xff1a;https://wwu.…

微信小程序最新调用用户头像以及昵称

众所周知&#xff1a;微信小程序开发是面对“公告”编程&#xff0c;小程序的api更新迭代之快&#xff0c;让人叫苦不堪&#xff0c;&#xff0c;&#xff0c; 最近开发小程序项目时&#xff0c;获取用户头像和昵称的方式发生了很大的改变&#xff1a; 它居然绑定到一个 butt…

微信小程序新版头像昵称API [保存用户头像到服务器]

根据微信官方文档的说法&#xff0c;2022年10月之后&#xff0c;原本的获取昵称和头像的api&#xff0c;也就是wx.getUserProfile和wx.getUserInfo将停止支持&#xff0c;在那之后发布和更新的小程序必须停止使用这两个api。 这两个api获得的用户头像均为一个url&#xff0c;指…

相片怎么变成漫画头像?分享个好用的处理工具

①.首先我们在电脑上打开任意浏览器&#xff0c;搜索进入改图在线做图页面。进入之后&#xff0c;可以看到上方的导航栏中有“去玩特效”这个导航&#xff0c;点击这里或者首页推荐工具下方的“照片特效”进入即可。 ②.进入照片特效页面后&#xff0c;这里有很多中卡通人脸特效…

taro小程序用户头像昵称获取

微信发布《小程序用户头像昵称获取规则调整公告》之后&#xff0c;无法再使用getUserProfile获取用户头像和昵称&#xff0c;因此小程序官方提供了头像昵称填写功能来完善个人资料。 对button添加open-type"chooseAvatar" bind:chooseavatar"onChooseAvatar&qu…

聊天截图厚码也不安全,大神写了算法分分钟给你还原

金磊 发自 凹非寺量子位 | 公众号 QbitAI 讲个恐怖的故事。 早上跟同事在微信闲谈&#xff0c;聊起了一位女同事最近的变化。 结果他反手就把文字打上马赛克&#xff0c;截图丢进了群里&#xff1a; 还欠欠儿地补了一刀&#xff1a; XXX&#xff0c;他说你坏话了呦~ 万万没想到…

深度对话三维家 | 4万亿市场,家装设计会诞生AIGC首个杀手级赚钱应用吗?

2022年&#xff0c;ChatGPT的火爆登场&#xff0c;超级烧钱的AI大模型赛道随即进入“千模大战”&#xff0c;“战况”惨烈异常。 时间来到2023年年中&#xff0c;AIGC热度不减&#xff0c;虽然创业者还在汹涌入局。究竟如何使用AIGC技术&#xff1f;AIGC技术可以在哪些场景率先…

2022年AIGC简单展望

2022 对于社会是不平凡的一年&#xff0c;而对于科技也同样是不平凡的一年。人们在社会中遭受着失意&#xff0c;却在科技中寻找希冀。对于一个命运共同体&#xff0c;它想着如何破除衰退&#xff0c;而同样对于一个活生生的个体或者家庭&#xff0c;他们也在摸索改变命运的机遇…

资本观望,大厂入局,海外大模型血脉压制……国内AIGC创业者的机会在哪里?...

图片来源&#xff1a;由无界 AI生成 A股AI概念股直线式拉涨&#xff0c;技术大牛带资进组分分钟成数十亿人民币独角兽&#xff0c;互联网巨头争抢着入局&#xff0c;政府各类扶持政策持续出台&#xff0c;媒体动不动就是万亿风口&#xff0c;500万年薪难招AIGC大牛……2022年以…

孔乙己新编

原创&#xff1a;刘教链 * * * 好币App的UI&#xff0c;是和别个儿不同的&#xff1a;开屏画面过后&#xff0c;扑面而来的是浓浓的山寨风&#xff0c;可以随时梭上一把。黄袍加身的人&#xff0c;傍午傍晚送完外卖&#xff0c;每每换上十几个u&#xff08;注&#xff1a;指USD…

裁员一万转身拥抱AI,Meta又要改名了

作者 | Eric 编辑 | Zuri‍‍‍‍‍‍ 首图来源&#xff1a;The New York TImes 美国科技四巨头中&#xff0c;如今就属Meta最显落寞了。 前不久&#xff0c;苹果CEO库克到访中国&#xff0c;不管是跟普通顾客在三里屯打成一片&#xff0c;还是跟科技部长会面&#xff0c;都受到…

巴比特 | 元宇宙每日必读:训练速度提升15倍,微软开源Deep Speed Chat,用户可通过“傻瓜式操作”训练大语言模型...

摘要&#xff1a;4月12日&#xff0c;微软宣布开源了Deep Speed Chat&#xff0c;用户可通过Deep Speed Chat提供的“傻瓜式”操作&#xff0c;以最短的时间、最高效的成本训练类ChatGPT大语言模型&#xff0c;这标志着一个人手一个ChatGPT的时代要来了。据悉&#xff0c;Deep …

AI大火:让卖课的先富起来

作者&#xff5c;路世明编辑&#xff5c;大 风 ChatGPT的爆火&#xff0c;再次掀起了全球人工智能产业的热潮。 自年初以来&#xff0c;国内外科技巨头相继开发并发布了一大批类GPT产品。海外方面&#xff0c;谷歌有Bard&#xff0c;Meta有LLaMA&#xff0c;亚马逊有Amazon B…

Feed43自定义 RSS 订阅源

Google Reader 的关闭后&#xff0c;到处充斥着 RSS 将死的论调。如今看来并没有想象中的那么惨&#xff0c;许多人依旧喜欢沿用 RSS 作为自己获取信息的方式。 前段时间&#xff0c;少数派 Matrix 进行了一次关于 RSS 的讨论&#xff0c;其中不乏有许多好的观点迸发出来。如果…

AI帮你解读基因检测结果?任重道远,未来可期

AI帮你解读基因检测结果&#xff1f;任重道远&#xff0c;未来可期 依赖于测序技术的发展&#xff0c;越来越多的基因检测产品应用于临床诊疗&#xff0c;可以辅助临床医生进行生育相关遗传病诊断、肿瘤精准诊疗与早期预防和感染病因查找等。但是&#xff0c;测序结果如何应用到…

GeneGPT 利用生物医学信息工具增强大型语言模型

尽管大型语言模型&#xff08;LLMs&#xff09;已成功应用于各种任务&#xff0c;但它们仍然有生成错误内容的问题。利用领域特定工具&#xff08;如数据库工具&#xff09;增强LLMs具有促进访问专业知识更精确和直接的潜力。文章介绍了GeneGPT&#xff0c;一种新的方法&#x…

彩票怎样才能中奖?通过一定的数学算法是否可行

理论上&#xff0c;只能靠运气。但是&#xff0c;如果规则设计得不好&#xff0c;就可以钻漏洞。 2005年2月&#xff0c;美国的一个彩票品种&#xff0c;就出现了漏洞&#xff0c;被麻省理工学院的学生发现了。随后的七年&#xff0c;这个学生反复购买这个品种&#xff0c;一共…

微信域名防封技术,APP推广链接如何在微信域避免被封,如何防拦截?

本身在网站要想在微信端被使用&#xff0c;多多少少都会有预防被拦截&#xff0c;是专门为运营网站和公众号的运营者一个研究的工具几十你是正常网站&#xff0c; 也是公司企业备案&#xff0c;照样也会被拦截。这个被拦截一般来说就是你的这个域名已经在微信中打不开了&#…

当域名被微信封了怎么办?

当把网站嵌入到微信公众号时&#xff0c;也存在一个风险&#xff1a;微信封域名&#xff0c;这样所有微信端的页面打开就会提示&#xff1a;已停止访问该网页&#xff0c;如下图所示&#xff1a; 最有效的解封方式 在违规的页面处理完毕后&#xff0c;运营或产品同学赶紧给mo…

微信域名防屏蔽防封系统,轻松微信中域名网站被屏蔽被封的问题

做微信营销活动&#xff0c;域名没被封过&#xff0c;那你的营销人生肯定是不完整的。如果做到微信域名防封呢&#xff1f;这就要借助一些工具来实现有效的防封措施了。 第一步 你需要有一个微信域名检测接口&#xff0c;自己开发或是购买都可以。 第二步 配置你的程序&…