有用过微信分享SDK的都应该知道,微信分享到朋友圈的时候是不能同时分享图片和文字的,只要有缩略图,那么文字就不会生效。那么问题就来了,如果我们想把APP内的某些内容连带图片一起分享到微信,是不是没办法了呢?

再想想我们常用的网易云音乐,允许我们把歌词连带着歌曲的图片拼在一起变成一张图,我们再把这张图片分享出去就好了。

那么,本篇的内容就是动手做一个带文字的图片。

这里也记录下上下文,因为做了一个失物招领的App,当有人上交了失物之后,可以将这个消息分享出去,这个消息内容有物品的信息和图片,而微信SDK始终无法做到,就想着把物品信息嵌入到图片中分享出去,先放一个效果图:

这个分享出去的图片很简单,上面是图片,下面是文字组合在一起。

先要知道,方案的原理是通过操作一个以Bitmap为基础的Canvas来做到的,思路很简单:

① 让画布作用在Bitmap上

② 在画布的上方绘制拍摄所得的图片

③ 在②所绘制的图片下面绘制文字

第一步很简单,我们只需要构造一个Bitmap并且装载到Canvas中就可以了,假设拍摄得到的图片名为bitmap,则代码如下:

Bitmap.Config config = bitmap.getConfig();
Bitmap shareBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), config);
Canvas canvas = new Canvas(shareBitmap);

到这里我们就要思考了,这个图片的宽高应该怎么设置比较合理呢?上面的代码设置为跟拍摄所得图片一样,也就是说,如果再需要添加文字,文字只能显示在图片上。这个时候,如果图片的颜色比较丰富,那么文字叠在上面就会很难看得清楚了。按照我上面图片的做法,是在拍摄图片的下面增加一些空间来绘制文字,这里要设置的高度应该要更加大一点。而究竟要多大我们等下再讨论。

第二步是在画布中绘制拍摄所得的图片,这里就很简单了,直接有这样的代码:

canvas.drawBitmap(bitmap, 0, 0, paint);

接着是第三步,也是最难的地方。这里不能直接在canvas中直接调用drawText方法来绘制文字!为什么?因为我们的文字内容有可能比图片的宽度要大,当文字比图片更宽的时候,使用drawText是无法让文字内容换行的,这样文字就被截断了。

解决的方案是使用TextPaint这个Paint的子类。这个类还需要配合StaticLayout来绘制文字,我们看看它的用法:

Paint paint = new Paint();
paint.setColor(Color.BLACK); // 画笔颜色
TextPaint textpaint = new TextPaint(paint);
textpaint.setTextSize(textSize); // 文字大小
textpaint.setAntiAlias(true); // 抗锯齿
StaticLayout title_layout = new StaticLayout(title.getText().toString(), textpaint, sourceBitmapWidth, Layout.Alignment.ALIGN_CENTER, 1f, 1f, true);

直接通过我们的Paint对象来创建一个TextPaint,接着设置抗锯齿和文字大小。接着创建一个StaticLayout对象,构造方法需要传入的参数分别是:文字内容、TextPaint对象、文本宽度、对齐方式、行距倍数、行距加数和是否包含内边距。这里比较重要的地方是设置文本宽度,当文本宽度比这个值大的时候就会自动换行。

当我们构造好了这个StaticLayout之后,就可以对画布进行定位,然后将文字绘制出来:

canvas.translate(0, sourceBitmapHeight); // 移动位置到图片的下面
title_layout.draw(canvas); // 在画布中绘制文字

完成了这几步之后,Canvas中的Bitmap就会有图片和文字了。

但是我们的问题其实还没有解决。

① 这个分享出去的Bitmap的高度究竟是多少呢?上面我们跳过了这个问题,其实已经有答案了,我们可以让它的高度为图片的内容加上我们创建的StaticLayout的高度就可以了。这样图片的高度会跟随文字内容的多少变化。获取StaticLayout的高度比较简单:

title_layout.getHeight()

②  这个时候,如果我们直接在App中显示这个图片,是没有什么问题的,但是如果我们把图片分享到微信,你会发现,图片的文字部分完全变成了黑色,连文字都看不到了。这里的解决办法也很简单,在绘制的时候,先给整个图片绘制一个白色的背景:

canvas.drawColor(Color.WHITE);

这里就基本完成了,代码也给出来大家参考下吧:

// 拍摄所得的图片为imageBitmapprivate Bitmap getShareingBitmap(int textSize) {Bitmap.Config config = imageBitmap.getConfig();int sourceBitmapHeight = imageBitmap.getHeight();int sourceBitmapWidth = imageBitmap.getWidth();Paint paint = new Paint();paint.setColor(Color.BLACK); // 画笔颜色TextPaint textpaint = new TextPaint(paint);textpaint.setTextSize(textSize); // 文字大小textpaint.setAntiAlias(true); // 抗锯齿StaticLayout title_layout = new StaticLayout(title.getText().toString(), textpaint,sourceBitmapWidth, Layout.Alignment.ALIGN_CENTER, 1f, 1f, true);StaticLayout desc_layout = new StaticLayout("物品描述:"+description.getText().toString(), textpaint,sourceBitmapWidth, Layout.Alignment.ALIGN_NORMAL, 1f, 1f, true);StaticLayout phone_layout = new StaticLayout("联系电话:"+phone.getText().toString(), textpaint,sourceBitmapWidth, Layout.Alignment.ALIGN_NORMAL, 1f, 1f, true);Bitmap share_bitmap = Bitmap.createBitmap(sourceBitmapWidth, sourceBitmapHeight +title_layout.getHeight() + desc_layout.getHeight() + phone_layout.getHeight(),config);Canvas canvas = new Canvas(share_bitmap);canvas.drawColor(Color.WHITE);canvas.drawBitmap(imageBitmap, 0, 0, paint); // 绘制图片canvas.translate(0, sourceBitmapHeight);title_layout.draw(canvas);canvas.translate(0, title_layout.getHeight());phone_layout.draw(canvas);canvas.translate(0, phone_layout.getHeight());desc_layout.draw(canvas);return share_bitmap;}

先计算所有文字内容的高度,然后构建图片的大小,绘制白色背景,绘制拍摄图片,在拍摄图片下绘制文字。

转载于:https://www.cnblogs.com/Fndroid/p/5630290.html

Android开发学习之路-带文字的图片分享相关推荐

  1. android开发学习之路——连连看之游戏逻辑(五)

    GameService组件则是整个游戏逻辑实现的核心,而且GameService是一个可以复用的业务逻辑类. (一)定义GameService组件接口 根据前面程序对GameService组件的依赖, ...

  2. android开发用百度识别图片格式,Android开发学习之路-机器学习库(图像识别)、百度翻译...

    对于机器学习也不是了解的很深入,今天无意中在GitHub看到一个star的比较多的库,就用着试一试,效果也还行.比是可能比不上TensorFlow的,但是在Android上用起来比较简单,毕竟Tens ...

  3. android开发学习之路——连连看之加载图片(三)

    正如前面AbstractBoard类的代码中看到的,当程序需要创建N个Piece对象时,程序会直接调用ImageUtil的getPlayImages()方法去获取图片,该方法将会随机从res\ dra ...

  4. Android开发学习之路--UI之简单聊天界面

    学了很多的ui的知识,这里就来实现个聊天的界面,首先来实现个layout的xml,代码如下: <?xml version="1.0" encoding="utf-8 ...

  5. Android开发学习之路-环境搭建

    这里选择使用android studio 集成开发环境,因为as是google推出的单独针对android开发的环境,并且迭代周期很快,因此,肯定会替代eclipse成为andorid的开发环境.对于 ...

  6. android 程序等待时间,Android开发学习之路--性能优化之常用工具

    Android性能优化相关的开发工具有很多很多种,这里对如下六个工具做个简单的使用介绍,主要有Android开发者选项,分析具体耗时的Trace view,布局复杂度工具Hierarchy View, ...

  7. Android开发学习之路--Camera之初体验

    顾名思义Camera就是拍照和录像的功能,像微信里面,我们想拍照传一下照片,就能够通过camera来拍照,然后存储照片.发送给好友.那么微信的app里面是不会直接通过camera api来实现的,由于 ...

  8. Android图片颜色比例,Android开发学习之路-图片颜色获取器开发(1)

    系列第一篇,从简单的开始,一步一步完成这个小项目. 颜色获取就是通过分析图片中的每个像素的颜色,来分析整个图片的主调颜色,有了主调颜色,我们可以用于图片所在卡片的背景或者标题颜色,这样整体感更加强烈. ...

  9. Android开发学习之路-指纹识别api

    在android6.0之后谷歌对指纹识别进行了官方支持,今天还在放假,所以就随意尝试了一下这个api,但是遇到了各种各样的问题 ①在使用FingerPrintManager这个类实现的时候发现了很多问 ...

  10. Android开发学习之路-Git的极简教程?

    Git是一个代码版本管理工具,也就是允许我们的一个项目拥有多个版本,这样我们可以随心所欲的修改我们的代码,如果出现问题,可以回退到某一个提交点.如果你还在用一堆堆注释来更新你的代码,那么可以尝试一下G ...

最新文章

  1. flex和bison实例分析
  2. 90行代码!大一学生自学编程,自创搜题网站,已在GitHub开源
  3. Apache与IIS的优劣对比点点评
  4. Struts2中 Result类型配置详解
  5. 傅里叶变换是用来做什么的,具体举例一下应用?
  6. 一个回滚段收缩的实例
  7. Android编译错误: The project cannot be built until build path errors are resolved
  8. AC自动机:多模式串匹配实现敏感词过滤
  9. 【2016年第4期】大数据应用系统的消息驱动架构
  10. windows 2008 终端服务器配置,windows 2008终端服务器设置
  11. Python各类图像库的图片读写方式总结
  12. 线性代数与MATLAB2
  13. Java根据成绩排名次_C语言按考试成绩排名次并存储到文件中
  14. 基于java浏览器的设计与实现_基于java的浏览器的设计与实现论文.docx
  15. unity渲染篇:烘焙模型贴图
  16. java put方式提交_java – 通过HTTP PUT请求上传文件
  17. Interspeech2022论文解读 | LODR:一种更好、更轻量的语言模型融合新方式
  18. 携程酒店评论EDA及词云展示—数据来自和鲸社区
  19. c语言输入10个数从小,C语言中,从键盘输入10个数,从小到大排列输出,怎
  20. python代码画樱花-python画樱花树代码 具体代码介绍

热门文章

  1. 0034-CM启动报InnoDB engine not found分析
  2. Linux:查看磁盘空间占用情况
  3. dpi数据接入shell脚本
  4. 公司项目NODEJS实践0.1[ ubuntu,nodejs,nginx...]
  5. 【入门经典】准备工作
  6. 【Android自定义控件】Android自定义虚线三
  7. font-awesome在Vue项目中的使用(npm使用)
  8. python飞机大战游戏代码_python实现飞机大战小游戏
  9. mysql使用变量填值为数组_MySQL如何有效的存储IP地址?
  10. linux中安装mysql_Linux下安装MySQL