美文网首页
一个适配古诗词的简单ViewGroup组件

一个适配古诗词的简单ViewGroup组件

作者: xandone | 来源:发表于2016-09-07 13:20 被阅读11次

在编写一个项目demo的时候,有一个界面提供给用户编辑“个人详情”的文字区域,面对千篇一律的界面,突然有个想法,使用古诗词的格式进行编写,显得比较逼格。


先看一下效果图吧


我的思考过程:

1,首先想到的是自定义一个TextView,控制它每行一个字,可以设置属性ems=1,但是这样时有问题的,这样设置的属性只是将“当行”的宽度等同于"M"的宽度,那么,就可能出现同行“11”或“ib”之类的情况。

2,将字符串分割成字符数组进行处理,控制每输入一个字符,添加一个回车符,这样就能解决问题了,但是新的问题出现了,每列显示的字数怎么确定,获取到字体的大小,与当前的父容器的高度进行比较,计算后得出每列显示的字数,同时也可以得到该“字符”需要用多少列来表示。

3,通过“2”将得到的各列“字符”用字符串数组进行储存,这时问题就简单了,将该字符串数组的元素依次进行显示即可。

4,问题又来了,在该自定义TextView中获取父容器,然后自动添加若干个自己呢?起初想使用getParent(),软并卵(或许有其他的方法,但是我没有找到)。

5,于是,我换了一中思维方向,既然很难获取到父容器,干脆自定义RelativeLayout,直接在该类里面根据输入的"字符内容"进行处理,自动添加若干的TextView

6,因为是内部自动添加的TextView,所以不可能提供许多关于TextView的属性,目前提供color 和size,比较常用。

7,这下回到标题内容,本意是适配古诗词,那么常见的有“五言绝句”、“七言律诗”、“词曲”、“白话”,我的解决方案是,提供sentence(句式)属性:

五言绝句:去除所有“非汉字”字符,每5字一组进行分割,然后排列;

七言律诗:去除所有“非汉字”字符,每7字一组进行分割,然后排列;

“词曲”:根据逗号进行分割,然后排列;

 白话:(默认):根据容器高度,直接排列。


主要逻辑实现:

将“内容”清除标点字符后,根据每列字数进行分割成字符串数组,然后处理

demo详情地址:GitHub - xandone/TextVerticalDemo

相关文章

网友评论

      本文标题:一个适配古诗词的简单ViewGroup组件

      本文链接:https://www.haomeiwen.com/subject/qdujettx.html