当前位置: 首页 > 编程笔记 >

安卓(Android)开发之分享带文字的图片

王凯旋
2023-03-14
本文向大家介绍安卓(Android)开发之分享带文字的图片,包括了安卓(Android)开发之分享带文字的图片的使用技巧和注意事项,需要的朋友参考一下

前言

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

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

这里也记录下上下文,因为做了一个失物招领的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的数字的组合) 反问您觉得我还需要提升什么? 说问的这些说的都挺不错,就是应该再学学安卓开发的,哎我投递的时候他要