前言
想想我们常用的网易云音乐,允许我们把歌词连带着歌曲的图片拼在一起变成一张图,我们再把这张图片分享出去就好了。
那么,本篇的内容就是动手做一个带文字的图片。
这里也记录下上下文,因为做了一个失物招领的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);
这里就基本完成了,代码也给出来大家参考下吧:
// 拍摄所得的图片为imageBitmap private 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; }
总结
先计算所有文字内容的高度,然后构建图片的大小,绘制白色背景,绘制拍摄图片,在拍摄图片下绘制文字。以上就是本文的全部内容了,希望对大家开发Android有所帮助。
本文向大家介绍安卓(Android)开发之自定义饼状图,包括了安卓(Android)开发之自定义饼状图的使用技巧和注意事项,需要的朋友参考一下 先来看看效果图 先分析饼状图的构成,非常明显,饼状图就是一个又一个的扇形构成的,每个扇形都有不同的颜色,对应的有名字,数据和百分比。 经以上信息可以得出饼状图的最基本数据应包括:名字 数据值 百分比 对应的角度 颜色。 用户关心的数据 : 名字 数据值
#23届找工作求助阵地# 因为我一问三不知面试官只能一直引导我有没有熟悉的,有些问题忘了()只答出来四次挥手和一点点进程线程的区别()大概还是根据你说你会的回答 自我介绍 说一下对安卓开发有什么了解 (根据你说的提问) 说不出来就有引导提问,听说过就具体聊一下相关知识,其实大概率也是八股,我就是没背() : 对布局类型的了解(相对布局、约束布局、线性布局) activity的调用和编程 装箱和拆箱
我正在通过skype与链接和图像共享文本,但唯一的图像被共享,而不是文本。请帮帮我,我找了很多,但没有得到任何有用的解决办法。
前言 我们将讨论 Google Android 工程师面试流程和准备所需的资源。我们还将讨论针对 Android 开发人员角色提出的问题类型。 众所周知,面试问题会随着应聘者的不同而变化。此外,面试过程会随着时间而变化。我们将讨论在 Google Android 开发者面试中一般会问什么类型的问题以及面试的一般过程。 首先,如何入围面试。 通过您目前在 Google 工作的朋友获得推荐。这是进入
22.10.10 共35分钟 自我介绍 hashmap的了解,优缺点 java class文件到二进制指令的过程 java class对象在JVM的存放位置 内存泄漏 项目相关,如何测试、用什么开发、项目有多少人、写了多少代码、出了多少bug 如何看待自己应聘的这个岗位,对这个岗位的了解,如何看待安卓开发的前景 学习和做项目的过程中目前遇到的最难的地方 除了科研以外,自己感兴趣学习的东西 为什么没
可能不缺人了吧,没有二面,我问联系人说是面试官没给我面评(HTTP协议 TCP协议 UDP协议,如何在链表中删除一个节点,如何在链表中添加一个节点,如何判断链表中是否有环,链表中节点的个数怎么查,去访问一个UrL这中间涉及到哪些协议,学习过哪些数据结构,算法题 找一个数组里面相加等于0的数字的组合) 反问您觉得我还需要提升什么? 说问的这些说的都挺不错,就是应该再学学安卓开发的,哎我投递的时候他要