背景

项目中涉及到群组聊天的功能,由于前期项目比较紧张,群组头像并没有按照群成员头像去自动生成,即类似微信群组头像的效果,今天进行一下效果优化,效果如下:

仿微信生成群组头像

实现步骤

获取群组成员头像

可以采用开源图片加载库把图片加载至本地即可。说明一下,这里并没有在线去加载头像,而是考虑到在其它地方有单独加载头像的地方,所以头像都是从本地直接读取。

生成群组头像

先上代码

public Bitmap generateGroupAvator(List data) {

switch (data == null ? 0 : data.size()) {

case 1: {

return data.get(0);

}

case 2: {

int widthSize = mSize / 2;

int heightSize = mSize / 2;

Bitmap groupAvator = Bitmap.createBitmap(mSize, mSize, Bitmap.Config.ARGB_8888);

Canvas canvas = new Canvas(groupAvator);

canvas.drawColor(0xFFe1e2e3);

for (int i = 0; i < data.size(); i++) {

Bitmap bitmap = data.get(i);

int width = bitmap.getWidth();

int height = bitmap.getHeight();

Matrix matrix = new Matrix();

matrix.postScale(widthSize * 1.0f / width, heightSize * 1.0f / height);

Bitmap newBit = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, false);

canvas.drawBitmap(newBit, i % 2 * widthSize, (mSize - heightSize) / 2 + i / 2 * heightSize, null);

}

canvas.save();

canvas.restore();

return groupAvator;

}

case 3: {

int widthSize = mSize / 2;

int heightSize = mSize / 2;

Bitmap groupAvator = Bitmap.createBitmap(mSize, mSize, Bitmap.Config.ARGB_8888);

Canvas canvas = new Canvas(groupAvator);

canvas.drawColor(0xFFe1e2e3);

for (int i = 0; i < data.size(); i++) {

Bitmap bitmap = data.get(i);

int width = bitmap.getWidth();

int height = bitmap.getHeight();

Matrix matrix = new Matrix();

matrix.postScale(widthSize * 1.0f / width, heightSize * 1.0f / height);

Bitmap newBit = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, false);

if (i == 0) {

canvas.drawBitmap(newBit, (mSize - widthSize) / 2, 0, null);

} else {

canvas.drawBitmap(newBit, i / 2 * widthSize, heightSize, null);

}

}

canvas.save();

canvas.restore();

return groupAvator;

}

case 4: {

int widthSize = mSize / 2;

int heightSize = mSize / 2;

Bitmap groupAvator = Bitmap.createBitmap(mSize, mSize, Bitmap.Config.ARGB_8888);

Canvas canvas = new Canvas(groupAvator);

canvas.drawColor(0xFFe1e2e3);

for (int i = 0; i < data.size(); i++) {

Bitmap bitmap = data.get(i);

int width = bitmap.getWidth();

int height = bitmap.getHeight();

Matrix matrix = new Matrix();

matrix.postScale(widthSize * 1.0f / width, heightSize * 1.0f / height);

Bitmap newBit = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, false);

canvas.drawBitmap(newBit, i % 2 * widthSize, i / 2 * heightSize, null);

}

canvas.save();

canvas.restore();

return groupAvator;

}

case 5: {

int widthSize = mSize / 3;

int heightSize = mSize / 3;

Bitmap groupAvator = Bitmap.createBitmap(mSize, mSize, Bitmap.Config.ARGB_8888);

Canvas canvas = new Canvas(groupAvator);

canvas.drawColor(0xFFe1e2e3);

for (int i = 0; i < data.size(); i++) {

Bitmap bitmap = data.get(i);

int width = bitmap.getWidth();

int height = bitmap.getHeight();

Matrix matrix = new Matrix();

matrix.postScale(widthSize * 1.0f / width, heightSize * 1.0f / height);

Bitmap newBit = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, false);

if (i < 2) {

canvas.drawBitmap(newBit, widthSize / 2 + i * widthSize, heightSize / 2, null);

} else {

canvas.drawBitmap(newBit, i % 3 * widthSize, heightSize / 2 + heightSize, null);

}

}

canvas.save();

canvas.restore();

return groupAvator;

}

case 6: {

int widthSize = mSize / 3;

int heightSize = mSize / 3;

Bitmap groupAvator = Bitmap.createBitmap(mSize, mSize, Bitmap.Config.ARGB_8888);

Canvas canvas = new Canvas(groupAvator);

canvas.drawColor(0xFFe1e2e3);

for (int i = 0; i < data.size(); i++) {

Bitmap bitmap = data.get(i);

int width = bitmap.getWidth();

int height = bitmap.getHeight();

Matrix matrix = new Matrix();

matrix.postScale(widthSize * 1.0f / width, heightSize * 1.0f / height);

Bitmap newBit = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, false);

canvas.drawBitmap(newBit, i % 3 * widthSize, heightSize / 2 + i / 3 * heightSize, null);

}

canvas.save();

canvas.restore();

return groupAvator;

}

case 7: {

int widthSize = mSize / 3;

int heightSize = mSize / 3;

Bitmap groupAvator = Bitmap.createBitmap(mSize, mSize, Bitmap.Config.ARGB_8888);

Canvas canvas = new Canvas(groupAvator);

canvas.drawColor(0xFFe1e2e3);

for (int i = 0; i < data.size(); i++) {

Bitmap bitmap = data.get(i);

int width = bitmap.getWidth();

int height = bitmap.getHeight();

Matrix matrix = new Matrix();

matrix.postScale(widthSize * 1.0f / width, heightSize * 1.0f / height);

Bitmap newBit = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, false);

if (i == 0) {

canvas.drawBitmap(newBit, widthSize, 0, null);

} else {

canvas.drawBitmap(newBit, (i + 2) % 3 * widthSize, (i + 2) / 3 * heightSize, null);

}

}

canvas.save();

canvas.restore();

return groupAvator;

}

case 8: {

int widthSize = mSize / 3;

int heightSize = mSize / 3;

Bitmap groupAvator = Bitmap.createBitmap(mSize, mSize, Bitmap.Config.ARGB_8888);

Canvas canvas = new Canvas(groupAvator);

canvas.drawColor(0xFFe1e2e3);

for (int i = 0; i < data.size(); i++) {

Bitmap bitmap = data.get(i);

int width = bitmap.getWidth();

int height = bitmap.getHeight();

Matrix matrix = new Matrix();

matrix.postScale(widthSize * 1.0f / width, heightSize * 1.0f / height);

Bitmap newBit = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, false);

if (i < 2) {

canvas.drawBitmap(newBit, widthSize / 2 + i * widthSize, 0, null);

} else {

canvas.drawBitmap(newBit, (i + 1) % 3 * widthSize, (i + 1) / 3 * heightSize, null);

}

}

canvas.save();

canvas.restore();

return groupAvator;

}

case 9: {

int widthSize = mSize / 3;

int heightSize = mSize / 3;

Bitmap groupAvator = Bitmap.createBitmap(mSize, mSize, Bitmap.Config.ARGB_8888);

Canvas canvas = new Canvas(groupAvator);

for (int i = 0; i < data.size(); i++) {

Bitmap bitmap = data.get(i);

int width = bitmap.getWidth();

int height = bitmap.getHeight();

Matrix matrix = new Matrix();

matrix.postScale(widthSize * 1.0f / width, heightSize * 1.0f / height);

Bitmap newBit = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, false);

canvas.drawBitmap(newBit, i % 3 * widthSize, i / 3 * heightSize, null);

}

canvas.save();

canvas.restore();

return groupAvator;

}

default:

break;

}

return null;

}

- 实现思路

根据图片张数,计算出每张头像在群组头像中的尺寸,然后缩放头像,最后把缩放后的头像画到合适的位置即可。

java 微信群组头像_仿微信生成群组头像相关推荐

  1. android微信群聊功能,Android仿微信群聊头像效果

    在网上找了些仿微信群聊头像的开源库后,发现没特别好用的,或者说满足我需求的,就只好在别人的基础上改了下,也就有了这样的自定义控件了,以此来实现微信群聊头像的效果,效果图如下所示: 主要实现: 一.自定 ...

  2. 安卓开发仿微信图片拖拽_仿微信朋友圈发表图片拖拽和删除功能

    原标题:仿微信朋友圈发表图片拖拽和删除功能 中国联通在香港公布了上市公司2017年中期业绩.2017年上半年,公司主要业绩指标持续向好,收入稳步回升,服务收入达到人民币1,241.1亿元,同比增长3. ...

  3. android仿微博头像_仿微博点击头像加载动画

    预览图 原理 整个效果分成两部分.一部分为弧度动画,一部分为点点动画 弧度动画就是画弧线,动画改变弧度就可以了 点点动画比较复杂.总共分为两步,1.计算非弧线的地方可以容纳的点点个数,然后画出来:2. ...

  4. 基于微信小程序开发的仿微信demo

    (本文参考自github/liujians,地址:https://github.com/liujians/weApp) 作者声明: 基于微信小程序开发的仿微信demo  整合了ionic的样式库和we ...

  5. Linux运维微信群,新闻|Linux 中国官方微信群开放加入

    终于,我找到了微信群的正确打开方式. 作为一家社区,提供交流渠道一直是我们的目标之一.从最早提供论坛:到后来开了 10 连号的 QQ 群,并升级到 2000 人群:再到微信兴起后拉了一个又一个的微信群 ...

  6. 企业微信SCRM系统部署_企业微信SCRM二次开发_企业微信SCRM系统独立版源码价格

    企业微信SCRM系统部署_企业微信SCRM二次开发_企业微信SCRM系统独立版源码价格 点趣互动是企业微信系统的第三方应用提供厂商,用于管理员工企业微信的内一款系统软件.点趣互动企业微信scrm软件主 ...

  7. java 头像 微信群_仿微信群头像九宫格控件 LQRNineGridImageView

    软件介绍 仿微信群头像九宫格控件 一.简介: 参照Android 仿微信群聊头像文章学习开发的一个仿微信群头像九宫格控件,感谢博主Loften_93663469. 效果如下: 二.使用: 1.在自己项 ...

  8. java 友好时间显示_仿微信的IM聊天时间显示格式(含iOS/Android/Web实现)[图文+源码]...

    本文为原创分享,转载请注明出处. 1.引言 即时通讯IM应用中的聊天消息时间显示是个再常见不过的需求,现在都讲究用户体验,所以时间显示再也不能像传统软件一样简单粗地暴显示成"年/月/日 时: ...

  9. android 仿qq群头像,Android仿微信和QQ多图合并框架(类似群头像)的实现方法

    Android仿微信和QQ多图合并框架(类似群头像)的实现方法 发布时间:2020-10-21 10:33:03 来源:脚本之家 阅读:97 作者:jyb_96 前言 现在多数app里面加入聊天已经是 ...

  10. java实现仿微信app聊天功能_Android仿微信语音聊天功能

    本文实例讲述了Android仿微信语音聊天功能代码.分享给大家供大家参考.具体如下: 项目效果如下: 具体代码如下: AudioManager.java package com.xuliugen.we ...

最新文章

  1. 3dmax批量导出fbx_推荐一款超实用的3DMAX插件——模法师
  2. ES6-const注意
  3. 天津工业大学19年计算机考研大纲,2019年天津工业大学《计算机原理及接口技术》考研复试大纲...
  4. C++11强类型枚举,override/final
  5. SAP 电商云 Spartacus UI Quick Order 延迟加载的现象分析
  6. 连接linux工具有哪些_推荐 10 个不错的网络监视工具,值得收藏
  7. 入门级控件 c# 1615014955
  8. warpaffine 旋转有一部分消失_如果月球消失了,会发生什么?我们的世界又将会变得怎么样?...
  9. JDK、JRE、JVM的区别及JavaSE、JavaEE和JavaME的区别?
  10. ZKUI中文编码以及以docker方式运行的问题
  11. MYSQL 调优和使用必读
  12. kill mysql 进程_如何快速处理mysql连接数占满的问题?
  13. 【22】基于java的电影院售票管理系统
  14. docker修改服务器ip地址,如何修改docker的ip地址
  15. 计算机硬件清理步骤,联想笔记本电脑清理灰尘详细步骤
  16. 按键精灵 获取某网站服务器时间,按键精灵如何获得网络时间的毫秒
  17. centos6 yum源失效解决方法
  18. C++/java设计模式汇总
  19. Windows下jmeter使用
  20. 北京信息科技大学考研c语言考试,2018年北京信息科技大学计算机院814数据结构和C语言程序设计[专硕]之C程序设计考研核心题库...

热门文章

  1. 一个完整推荐系统的设计实现-以百度关键词搜索推荐为例
  2. 论人类不平等起源读后感
  3. Linux 基本操作
  4. 【回顾】巨杉数据库中标渤海银行,股份制银行再下一城
  5. 真正提升关键词排名的外链应该怎样发?
  6. Output Shape和Param参数解释
  7. php getimagesize 导致系统变慢
  8. 应届生面试这样准备,最能展现自己优势!
  9. 三星手机com.android.systemservice卸载,完美卸载 系统程序卸载就用System App Remover
  10. python字典筛选