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