android 多行文本换行,Android进阶——或许是处理“More&click”型多行的TextView换行的最优雅的一种方式...

引言

相信很多Android APP 开发者在处理TextView 换行的时候都曾头痛不已过,尤其是在做复杂布局的时候,适配的时候都踩过不少坑。笔者也踩过,直到在一次查看源码的时候发现了ViewTreeObserver,总算是实现了优雅的格式化多行文本,在使用一个控件的时候抽点时间了解下提供的公共方法,有时候可以避免很多不必要的坑。

一、ViewTreeObserver概述

ViewTreeObserver顾名思义就是视图树的观察者角色,可以监听视图树的全局变化,比如整棵树的布局,开始的绘画传递,触摸模式的改变等等,都提供了对应的八个监听接口(A view tree observer is used to register listeners that can be notified of global changes in the view tree)。ViewTreeObserver用来注册监听器,在视图树全局发生变化时收到通知。它不能被应用实例化,因为它是由视图提供,只能通过调用android.view.View的getViewTreeObserver()来获取对应的实例。

这里写图片描述

其实整个ViewTreeObserver机制从源码上看,本质上就是个观察者模式,那么主要的角色就有两种:

ViewTree视图树——在Android中所有视图由View和View的子类组成。ViewGroup也是view的子类,它是View的容器,它可以装载View和ViewGroup。这样ViewGroup和View以树形结构一层一层的嵌套组合,就形成了视图树。

Observer观察者。使用了观察者的设计模式,ViewTree是被观察者(或者说是主题、内容),ViewTreeObserver是观察者,通过ViewTreeObserver注册监听来观察ViewTree的变化,当ViewTree发生变化,就会调用ViewTreeObserver的相关方法来通知其这一改变。我们可以在ViewTreeObserver中add自己的监听器,从而得到ViewTree的某一变化的通知做出自己的逻辑处理。

二、SpannableString和ClickableSpan概述

SpannableString和ClickableSpan本质上就是高级的String,具体可参见Android进阶——借助强大Span家族增添丰富的特效及格式化字符串。

三、实现思路

简单来说就是实现根据TextView要实现的字符串长度去动态适配。

通过ViewTreeObserver机制监听,TextView绘制之后,在OnGlobalLayoutListener中计算原始的字符串长度,当多行显示的时候,以第一行所显示字符的个数为行长。

判断最后一行的长度,并进行逻辑处理,添加“More”型字符串

以Span系为辅助实现点击,并开放接口

四、实现源码

你可能感兴趣的:(android,多行文本换行)