便签记事本是用户常用的一类手机软件,目前各大主流手机均自带此类的工具,并且功能逐渐完善,其中有一项功能——一键生成图片分享比较吸引眼球,尤其是有些社交app在分享动态时有字数限制,如果将要发的内容生成图片就可以解决这个困扰。对比了几家主流手机的自带便签,三星不具备生成图片功能,锤子、魅族、华为具备,但生成时有稍微卡顿,小米同样具备,生成图片时未出现明显卡顿。现在我们也尝试实现此功能。

我们常用的方式是使用Canvas的drawText绘制文本,但它是不会自动换行的,即使一个很长很长的字符串,drawText也只显示一行,超出部分被隐藏在屏幕之外。可以逐个计算每个字符的宽度,通过一定的算法将字符串分割成多个部分,然后分别调用drawText一部分一部分的显示, 但是这种显示效率会很低。
StaticLayout是android中处理文字换行的一个工具类,StaticLayout已经实现了文本绘制换行处理。它跟TextView的效果是一样的,其实TextView也是调用StaticLayout来实现换行的。
StaticLayout的构造函数有三个:

public StaticLayout(CharSequence source,TextPaint paint,int width,Layout.Alignment align,float spacingmult,float spacingadd,boolean includepad)public StaticLayout(CharSequence source,int bufstart,int bufend,TextPaint paint,int outerwidth,Layout.Alignment align,float spacingmult,float spacingadd,boolean includepad)public StaticLayout(CharSequence source,int bufstart,int bufend,TextPaint paint,int outerwidth,Layout.Alignment align,float spacingmult,float spacingadd,boolean includepad,TextUtils.TruncateAt ellipsize,int ellipsizedWidth)

实际上都是调用的第三个 构造函数,下面是它的参数解释:

1.需要分行的字符串
2.需要分行的字符串从第几的位置开始
3.需要分行的字符串到哪里结束
4.画笔对象
5.layout的宽度,字符串超出宽度时自动换行。
6.layout的对其方式,有ALIGN_CENTER, ALIGN_NORMAL, ALIGN_OPPOSITE 三种。
7.相对行间距,相对字体大小,1.5f表示行间距为1.5倍的字体高度。
8.在基础行距上添加多少
实际行间距等于这两者的和。
9.参数未知
10.从什么位置开始省略
11.超过多少开始省略
需要指出的是这个layout是默认画在Canvas的(0,0)点的,如果需要调整位置只能在draw之前移Canvas的起始坐标
canvas.translate(x,y);

生成长图功能的实现:

    public static Bitmap getBitmap(Context context, EditText mEditText) {Editable editable = mEditText.getText();TextPaint textPaint = new TextPaint();textPaint.setARGB(0xFF, 0, 0, 0);textPaint.setTextSize(mEditText.getTextSize()- DisplayUtils.sp2px(context, 2));// 设置字体String fontPath = Cache.read_String(SharedPreferencesKey.KEY_FONT, "");if (!TextUtils.isEmpty(fontPath)) {File fontFile = new File(fontPath);if (fontFile.isFile() && fontFile.exists())textPaint.setTypeface(Typeface.createFromFile(fontFile));}ScreenInfo mScreenInfo = ScreenInfo.getInstance();float bitmapWidth = mScreenInfo.getWidthPixels()- DisplayUtils.dip2px(context, 10);float padding = DisplayUtils.dip2px(context, 15);StaticLayout layout = new StaticLayout(editable, textPaint,(int) (bitmapWidth - padding * 4), Alignment.ALIGN_NORMAL,1.2F, 0.0F, true);float bitmapHeight = layout.getHeight() + padding * 10;Bitmap bitmap = null;try {bitmap = Bitmap.createBitmap((int) bitmapWidth, (int) bitmapHeight,Bitmap.Config.ARGB_8888);} catch (OutOfMemoryError e) {e.printStackTrace();return null;}Canvas paper = new Canvas(bitmap);paper.drawColor(ColorSelectView.getColor(2));paper.translate(padding * 2, padding * 4);layout.draw(paper);paper.translate(-padding * 2, -padding * 4);Paint mPaint = new Paint(Paint.DITHER_FLAG);mPaint.setColor(Color.GRAY);mPaint.setStyle(Paint.Style.STROKE);mPaint.setStrokeWidth(DisplayUtils.dip2px(context, 0.5f));float offset = DisplayUtils.dip2px(context, 2);paper.drawRect(new Rect((int) (padding), (int) (padding * 2),(int) (bitmapWidth - padding),(int) (bitmapHeight - padding * 4)), mPaint);paper.drawRect(new Rect((int) (padding - offset),(int) (padding * 2 - offset), (int) (padding),(int) (padding * 2)), mPaint);paper.drawRect(new Rect((int) (bitmapWidth - padding),(int) (padding * 2 - offset),(int) (bitmapWidth - padding + offset), (int) (padding * 2)),mPaint);paper.drawRect(new Rect((int) (padding - offset),(int) (bitmapHeight - padding * 4), (int) (padding),(int) (bitmapHeight - padding * 4 + offset)), mPaint);paper.drawRect(new Rect((int) (bitmapWidth - padding),(int) (bitmapHeight - padding * 4), (int) (bitmapWidth- padding + offset),(int) (bitmapHeight - padding * 4 + offset)), mPaint);paper.drawRect(new Rect((int) (padding + offset),(int) (padding * 2 + offset),(int) (bitmapWidth - padding - offset), (int) (bitmapHeight- padding * 4 - offset)), mPaint);TextPaint fromTextPaint = new TextPaint();fromTextPaint.setColor(Color.GRAY);fromTextPaint.setTextSize(DisplayUtils.sp2px(context, 12));StaticLayout fromLayout = new StaticLayout(Cache.read_String(KEY_SHARE_TAIL, context.getString(R.string.share_image_info)),fromTextPaint, (int) (bitmapWidth - padding * 3.5),Alignment.ALIGN_NORMAL, 1.0F, 0.0F, true);paper.translate(padding, bitmapHeight - padding * 3);fromLayout.draw(paper);return bitmap;}

效果展示:

Android StaticLayout实现主流便签内容生成长图功能相关推荐

  1. Android 仿各主流便签内容生成长图功能

    1.前言 目前各大主流手机均有各自的便签记事本之类的工具,并且功能逐渐完善,其中有一项功能--生成图片分享比较吸引眼球,尤其是有些社交app在发动态是有字数限制,如果将要发的内容生成图片就会解决这个困 ...

  2. uni-app手机截图页面某区域内容-生成长图方法

    uni-app手机截图页面某区域内容-生成长图方法 (来自我的今日头条,都是我的博客) 以下是截图当前页面指定区域的全部内容方法 安卓测试可行,测试机型为华为,ios没有业务需要所以没做,仅供参考,觉 ...

  3. 电脑桌面云便签怎么生成便签二维码和其他人共享便签内容?

    电脑桌面便签软件Windows版个人便签支持将单条便签内容生成二维码,其他人可通过敬业签App.微信.支付宝或者浏览器的扫一扫功能,扫码识别便签中的内容事项. 一.打开已登录的敬业签电脑桌面便签软件W ...

  4. 怎么在手机上做文字长图?云便签可将文字生成长图并分享

    有时候,我们需要在手机上记录一些文字,并分享给别人.如果只以文字形式分享,会有较多的局限性,那么能否将文字生成图片,以文字长图的形式将内容分享给好友呢? 其实,文字长图生成并不难,我们常用的多端同步云 ...

  5. Android 生成长图并添加水印(一)

    本来是想做一下ListView生成长图的,最后发现ListView未显示部分获取不到,就把ListView改成了NestedScrollView包裹LinearLayout,在LinearLayout ...

  6. html间隔怎么打_iPhone手机便签内容怎么设为重要事项?

    iPhone手机上有一款非常实用的便签软件,名字叫做敬业签.使用敬业签不但可以记录待办事项,还可以为记录的内容设置各种各样的提醒防止自己遗忘.如果有一些事情比较重要的话,还可以设置为重要事项达到间隔提 ...

  7. 用python和adb将一加便签内容迁移到小米或其他品牌便签软件

    (暂时不支持图片) 最近手机从一加换到小米了.因为平时喜欢写备忘录,一加便签里记了很多条信息.但是手机搬家只能搬一个没有签名的阉割版一加便签过来,原来记的笔记都没了.网上一搜解决办法全是莫名其妙的啥波 ...

  8. 如何备份便签内容,便签云备份在哪里

    便签软件往往保存着用户大量重要数据,如果用户要换电脑或者手机,如何备份便签内容呢? 有的便签是在电脑/手机本地使用的,数据也会保存在本地.如果要备份的话,可以通过复制粘贴等形式,把内容保存到别的地方. ...

  9. 云便签Mac和Web网页版怎么对便签内容排序?

    一.打开便签并登录账号,默认进入个人便签内容列表,在界面左侧可点击便签的分类名称,进入要排序的便签分类内容列表: 二.在内容列表点击右上角的"全部内容",打开排序功能设置框: 三. ...

最新文章

  1. 清华大学计算机专业学生埃朗读村,《朗读者~矣晓沅(清华大学计算机研究生  彝族)》...
  2. mysql的正则书写规则_MySql中正则表达式的使用方法描述
  3. 理解Go语言中的方法和接收者
  4. equals()方法
  5. 2异常处理_异常是什么?什么是常用类?
  6. oracle实现mysql的if_【原创】ORACLE的几个函数在MYSQL里面的简单实现
  7. android学习一---搭建开发环境
  8. 分片报文的最后一片_分片报文攻击防范 - CloudEngine 12800, 12800E V200R005C10 配置指南-安全 - 华为...
  9. 怎样黑网吧的万象系统_5636小编教你如何进入万象网管系统
  10. oracle yyyymmdd 年末,oracle中日期格式'yyyy-mm-dd'和'yyyymmdd'的区别
  11. 使用BeautifulSoup解析网页内容
  12. 计算机模拟掷骰子试验,掷骰子模拟
  13. Stylus入门教程--实例(1)
  14. bat批处理,变量不生效
  15. Navicat连接云端服务器上的MySQL数据库
  16. 关于逆向工程,解决mysql数据库遇到的1406问题,ERROR 1062 (23000): Duplicate entry '0' for key 'PRIMARY'
  17. 韶关python培训班_新华字典:韶_“韶”的意思,五笔,笔画,拼音,五行_HttpCN
  18. 图像基本运算--图像合并
  19. svn分支介绍和使用
  20. 我的Java开发学习之旅------Java资源的国际化详解

热门文章

  1. 在网页中画ICON图标
  2. 利用递归函数求斐波那契数列(兔子序列) 1、1、2、3、5、8、13、21...
  3. 2017年PHP程序员未来路在何方
  4. Ubuntu: 将bing主页的背景图片设置为桌面壁纸
  5. 谷歌无人车报告(中文版)(42页):通往自动驾驶之路
  6. 互联网产品设计进阶(12)描绘用户心中的海市蜃楼
  7. 网络爬虫-tx滑块验证码
  8. cvss(cvss)
  9. python中ret是什么意思_python中ret
  10. kubernetes 教程 笔记