CharSequence
TextView是主要用于显示文本的一个控件,所以首先来看一下文本,CharSequence是java定义的一个接口,String实现了该接口。Android写了一个Spanned接口继承了CharSequence,主要用于标记文对象的的范围。Spannable又继承Spanned,Spannable中有一个静态内部类工厂类用于创建SpannableString主要是在TextView中创建SpannableString
通过
Spannable可以实现文本的下划线、斜体、放大的等功能。Span | Android 开发者 | Android Developers (google.cn)
在TextView的
onDraw()中调用了layout.draw()这个layout是TextView中的一个布局和画背景和文本的类,不是指的布局layout,DynamicLayout、BoringLayout、StaticLayout都继承了layout
DynamicLayout:用在EditText或者TextView中设置的是Spannable类型的文字(比如ClickSpan,URL等)。
BoringLayout:常用在处理单行文本。(所有字符必须是LTR[left-to-right])
StaticLayout:这个是默认的TextView的Layout,用在文字不会被改变的状态下。
EditText
EditText继承自TextView,EditText内部没有做什么事,就重写了几个TextView的方法。主要的实现还是在TextView中。
EditText重写了
getDefaultEditable()和getDefaultMovementMethod(),MovementMethod是提供光标位置、滑动、以及文本选择的一个接口,ArrowKeyMovementMethod提供了光标移动和选择,以及支持显示弹出上下文菜单。实现的原理是通过调用Selection.setSelection(),设置文本的spannable的,然后再重绘调用onDraw的时候画出来。