这篇文章介绍一下使用富文本实现点赞展示效果(包含点赞人员的头像),之前使用的是SpannableString写的,但是只是实现了显示默认的小心心和后边的昵称,头像没有展示展示出来。后来将SpannableString换成了SpannableStringBuilder。整体思路就是:使用多个SpannableStringBuilder将默认的小心心、个人头像、昵称拼接起来显示。下面是代码所示:

//设置点赞具体人员(利用富文本)
//判断点赞的集合是否为空
if (ListHelper.isNotEmpty(item.getLikes())) {
//tv_community_like是展示点赞信息的TextView
tv_community_like.setVisibility(View.VISIBLE);

        SpannableStringBuilder[] builder = new SpannableStringBuilder[1];SpannableStringBuilder defaultStringBuilder = new SpannableStringBuilder("#");//blue_heart为默认的小心心图片,可以将小心心图片换成自己需要的Drawable drawable = context.getResources().getDrawable(R.mipmap.blue_heart);drawable.setBounds(0, 5, 40, 40);//这是将小心心图片绘制在某一矩形区域内//HouseImageSpan是自定义的ImageSpan为了实现将点赞信息垂直居中显示而写,后面会详细介绍HouseImageSpan imageSpan = new HouseImageSpan(drawable);defaultStringBuilder.setSpan(imageSpan, 0, 1, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);builder[0] = defaultStringBuilder;for (int i = 0; i < item.getLikes().size(); i++) {//moren_head_2是头像未加载出来之前显示的默认图片,可以根据需求自己更换Drawable drawable1 = context.getResources().getDrawable(R.mipmap.moren_head_2);drawable1.setBounds(0, 15, 80, 15);HouseImageSpan imageSpan1 = new HouseImageSpan(drawable1);//imgStringBuilder 为默认头像显示的SpannableStringBuilder,最后需要将其与其他SpannableStringBuilder拼接在一起展示final SpannableStringBuilder[] imgStringBuilder = {new SpannableStringBuilder("#")};imgStringBuilder[0].setSpan(imageSpan1, 0, 1, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);if (StringHelper.isNotEmpty(item.getLikes().get(i).getLogo())) {int finalI = i;//使用Glide将网络图片的URL(item.getLikes().get(i).getLogo())转成BitmapGlide.with(MyApplication.getApplication().getApplicationContext()).load(item.getLikes().get(i).getLogo()).asBitmap().into(new SimpleTarget<Bitmap>() {@Overridepublic void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {//将转成的Bitmap(resource)转成缩略图Bitmap bitmap = BitmapHelper.getImageSmall(resource, 120, 120);//将Bitmap转成圆形图片Bitmap bitmap2 = BitmapHelper.toRoundBitmap(bitmap);HouseImageSpan imageSpan2 = new HouseImageSpan(bitmap2);imgStringBuilder[0].setSpan(imageSpan2, 0, 1, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);builder[0] = builder[0].append(imgStringBuilder[0]);}});}//nickNameBuilder为昵称的SpannableStringBuilderSpannableStringBuilder nickNameBuilder;if (i == item.getLikes().size() - 1) {nickNameBuilder = new SpannableStringBuilder(item.getLikes().get(i).getNickname());} else {nickNameBuilder = new SpannableStringBuilder(item.getLikes().get(i).getNickname() + ",");}builder[0] = builder[0].append(nickNameBuilder);}//builder[0]就是最终要展示的SpannableStringBuildertv_community_like.setText(builder[0]);} else {tv_community_like.setVisibility(View.GONE);}

以上就是所有展示此效果的代码,下面介绍文章中提到的自定义ImageSpan

public class HouseImageSpan extends ImageSpan {
public HouseImageSpan(Drawable d) {
super(d);
}

public HouseImageSpan(Bitmap b){super(b);
}//通过改变getSize方法来改变位置垂直居中显示
public int getSize(Paint paint,CharSequence text,int start,int end,Paint.FontMetricsInt fm){Drawable d = getDrawable();Rect rect = d.getBounds();if (fm != null) {Paint.FontMetricsInt fmPaint=paint.getFontMetricsInt();int fontHeight = fmPaint.bottom - fmPaint.top;int drHeight=rect.bottom-rect.top;int top= drHeight/2 - fontHeight/4;int bottom=drHeight/2 + fontHeight/4;fm.ascent=-bottom;fm.top=-bottom;fm.bottom=top;fm.descent=top;}return rect.right;
}@Override
public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint) {Drawable b = getDrawable();canvas.save();int transY = 0;transY = ((bottom-top) - b.getBounds().bottom)/2+top;canvas.translate(x, transY);b.draw(canvas);canvas.restore();}

}

文章中提到的将原图转成缩略图的方法是

public static Bitmap getImageSmall(Bitmap bm, int newWidth, int newHeight) {
int width = bm.getWidth();
int height = bm.getHeight();
// 设置想要的大小
// 计算缩放比例
float scaleWidth = ((float) newWidth) / width;
float scaleHeight = ((float) newHeight) / height;
// 取得想要缩放的matrix参数
Matrix matrix = new Matrix();
matrix.postScale(scaleWidth, scaleHeight);
// 得到新的图片
Bitmap newbm = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, true);
return newbm;
}

通过以上方法可以将原图转成缩略图,下面再介绍将缩略图转成圆形图片

/**
* bitmap圆形处理
*
* @param bitmap
* @return
*/
public static Bitmap toRoundBitmap(Bitmap bitmap) {
int width = bitmap.getWidth();
int height = bitmap.getHeight();
float roundPx;
float left, top, right, bottom, dst_left, dst_top, dst_right, dst_bottom;
if (width <= height) {
roundPx = width / 2;
top = 0;
bottom = width;
left = 0;
right = width;
height = width;
dst_left = 0;
dst_top = 0;
dst_right = width;
dst_bottom = width;
} else {
roundPx = height / 2;
float clip = (width - height) / 2;
left = clip;
right = width - clip;
top = 0;
bottom = height;
width = height;
dst_left = 0;
dst_top = 0;
dst_right = height;
dst_bottom = height;
}
Bitmap output = Bitmap.createBitmap(width,
height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(output);
final int color = 0xff424242;
final Paint paint = new Paint();
final Rect src = new Rect((int) left, (int) top, (int) right, (int) bottom);
final Rect dst = new Rect((int) dst_left, (int) dst_top, (int) dst_right, (int) dst_bottom);
final RectF rectF = new RectF(dst);
paint.setAntiAlias(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(color);
canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(bitmap, src, dst, paint);
return output;
}

下面展示一下效果

以上就是所有功能的实现,感谢大家

Android使用富文本实现点赞效果(包含点赞人员的头像)相关推荐

  1. 使用富文本OHAttributedLabel

    OHAttributedLabel 富文本标签 https://github.com/AliSoftware/OHAttributedLabel 以下是我渲染出来的效果 OHAttributedLab ...

  2. CSDN使用富文本编辑器为所发布的文章生成右侧目录

    如果我们想为我们的文章生成相应的目录,在不使用MD编辑器的情况下,我们使用富文本编辑器也是可以为我们的文章生成目录(特别提醒:最少需设置4个标题这样才能看出效果).我们可以假设需要发布的文章已经编辑好 ...

  3. 杨老师教你学会使用富文本编辑器KindEditor之添加页面设计

    2018-12-06 进行整理本篇文章,主要是解决如何引入富文本编辑器的使用 2019-06-18 进行了二次完善,解决了富文本编辑器的图片上传和附件上传问题 本篇文章进行二次更新操作,完善了上传图片 ...

  4. ue4字符串 区别 文本_UE4中使用富文本(RichTextBlock多格式文本块)

    前言 哈喽大家好啊~好久没有写东西了,最近闹疫情,实在是没心情!其实主要还是因为太懒了! 今天将为大家分享个不是很新的技术,但是又是在游戏开发里常出现的需求,富文本应用. 说到富文本,可能很多人并不知 ...

  5. Django 3.2.5博客开发教程:使用富文本编辑器添加数据

    在Django admin后台添加数据的时候,文章内容文本框想发布一篇图文并茂的文章需就得手写Html代码,这十分吃力,也没法上传图片和文件.这显然不是我等高大上程序猿想要的. 为提升效率,我们可以使 ...

  6. Django实现的博客系统中使用富文本编辑器ckeditor

    操作系统为OS X 10.9.2,Django为1.6.5. 1.下载和安装 1.1 安装 ckeditor 下载地址 https://github.com/shaunsephton/django-c ...

  7. vue获取编辑器纯文字_vue中使用富文本编辑器

    前端使用富文本编辑器的插件有很多,今天献上wangeditor的使用教程,教你如何在vue中使用富文本编辑器 wangeditor是一个萌新富文本编辑器,基于js和css,重点在于它轻量,如果你需要的 ...

  8. 微信小程序-后台使用富文本编辑器返回数据,小程序编译富文本编辑器返回的数据

    最近遇到一个功能,后台管理系统添加商品的时候,商品详情是使用富文本编辑器添加的.小程序获取的商品详情数据是含有<p>标签的. 后台管理系统 百度了多种方法,也试用了很多方法,最终觉得wxP ...

  9. Django中使用富文本编辑器Uedit

    Uedit是百度一款非常好用的富文本编辑器 一.安装及基本配置 官方GitHub(有详细的安装使用教程):https://github.com/zhangfisher/DjangoUeditor 1. ...

最新文章

  1. java h5获取ip,websocket中获取客户端通信的真实IP
  2. python小练习--模拟用户登录,(3次重试机会,登录成功展示登录账号密码)
  3. 算法:柱状图中最大矩形
  4. 北大邮箱收件服务器,北京大学微电子学研究院邮件系统
  5. 《SAS编程与数据挖掘商业案例》学习笔记之十六
  6. 一种基于伪标签半监督学习的小样本调制识别算法
  7. 2017.9.5.1.语文
  8. (42)FPGA面试题时钟抖动和时钟偏移
  9. ArrayList 使用迭代抛出ConcurrentModificationException解决方法
  10. 2021桂花开得真晚,晚了将近一个月
  11. python爬虫线上编辑_Python 爬虫入门《中》
  12. MySQL 检索 JSON 字段
  13. VSCode自定义网络背景皮肤
  14. oracle批量查询更新,Oracle批量查询、删除、更新使用BULK COLLECT提高效率
  15. Unity打包后窗口在PC端不按照设置的大小显示
  16. SAP 折旧在13-16调整期
  17. c语言s型曲线方程,电机控制 | S曲线加减速
  18. oracle安装使用
  19. CIKM 2022|FwSeqBlock: 一种在序列建模中增强行为表征的方法
  20. 基于Arduino和AS608模块的指纹门禁锁--舵机控制

热门文章

  1. 6-2 综合成绩排名-结构体二 (100分)
  2. Ubuntu使用+Thinkphp5学习——17(报错Warning: require(/var/www/html/tp5-github/public/../thinkphp/start.php):)
  3. 使用javaassist动态修改字节码文件
  4. X79双cpu linux,X79平台Hackintosh(黑苹果)
  5. Simotion应用与组网之六 编程篇
  6. 快播倒下了,网盘站起来
  7. C语言实现-------找数字游戏
  8. blender script 批量重命名材质
  9. discuz x2.5 php 自动发帖
  10. [原创] JQ仿淘宝图片局部放大镜效果