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

在编写一个项目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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容