SpannableString及其相关类的使用

一、继承关系

继承关系
由于TextView.setText(CharSequence text)接收参数类型为CharSequence,所以他们都能作为setText的参数使用。

二、主要方法

1.setSpan(Object what, int start, int end, int flags)

参数含义:

  • what 各种Span样式。
  • start 改变样式的字符起点,就是要改的第一个下标。
  • end 改变样式的字符终点,就是要改的最后一个下标的下一个下标。
    通常end = start + length。
  • flags 标记位,用于标记修改字符串前后的字符的变化规则。
  • 注意这里中文一个字算一个字符。

what参数:

  • 常用类型

    • ForegroundColorSpan 文本颜色
    • BackgroundColorSpan 文本背景色
    • URLSpan 文本超链接
    • UnderlineSpan 下划线
    • StrikethroughSpan 删除线
    • ImageSpan 图片
    • DynamicDrawableSpan 设置图片,基于文本基线或底部对齐。
    • ClickableSpan 点击事件
  • 其他类型

    • StyleSpan 字体样式:粗体、斜体等
    • MaskFilterSpan 修饰效果,如浮雕模糊(BlurMaskFilter)
    • RasterizerSpan 光栅效果
    • TextAppearanceSpan 文本外貌(包括字体、大小、样式和颜色)
    • TypefaceSpan 文本字体
    • SuggestionSpan 相当于占位符
    • AbsoluteSizeSpan 文本字体(绝对大小)
    • RelativeSizeSpan 相对大小(文本字体)
    • ScaleXSpan 基于x轴缩放
    • SubscriptSpan 下标(数学公式会用到)
    • SuperscriptSpan 上标(数学公式会用到)

flags参数:

  • Spannable.SPAN_EXCLUSIVE_INCLUSIVE
    新增前插字符不应用效果,新增后插字符应用效果。

  • Spannable.SPAN_INCLUSIVE_EXCLUSIVE
    新增前插字符应用效果,新增后插字符不应用效果。

  • Spannable.SPAN_INCUJSIVE_INCLUSIVE
    前后新增的字符都应用效果。

  • Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
    前后新增的字符都不应用效果。

三、图解参数

1.start、end、flags参数图解

图解参数

2.what参数图解

由于种类过多就不做了。其实没必要做,你只需要知道你想做什么效果,然后点进该类源码,查看构造函数和其公有方法,自然就了解这个类有什么用了。

了解一个类有什么功能的捷径就是查看源码,本篇文章仅辅助你去理解他们。

FlexboxLayout的使用

一、介绍

项目地址:https://github.com/google/flexbox-layout

官方文档如是说:FlexboxLayout is a library project which brings the similar capabilities of CSS Flexible Box Layout Module to Android.(FlexboxLayout是类似前端CSS的Flexible Box Layout的Android控件。)

我们可以将它看作LinearLayout的增强版,因为它的子View也是按一定顺序排列的。

主轴和副轴

现定义以下概念:

1.主轴

新元素排列方向为主轴。

2.副轴

与主轴垂直方向为副轴。

二、FlexboxLayout自身属性

1.flexDirection主轴方向

  • row (默认)主轴为水平方向,从左到右排列。
  • row_reverse 主轴为水平方向,从右到左排列。
  • column 主轴为垂直方向,从上到下排列。
  • column_reverse 主轴为垂直方向,从下到上排列。

2.flexWrap换行方式

  • nowrap 不换行。(如果位置不足会压缩子元素)
  • wrap 按正常方向换行。
  • wrap_reverse 按反方向换行。

3.justifyContent主轴对齐模式

  • flex_start (默认值)左对齐。
  • flex_end 右对齐。
  • center 居中。
  • space_between 首尾Item紧贴边界,Item平分内部空隙。
  • space_around 每个Item两侧的间隔相等。项目之间的间隔比项目与边框的间隔大一倍。

4.alignItems副轴对齐模式

  • stretch (默认值)占满整个容器的高度。
  • flex-start 副轴的起点对齐。
  • flex-end 副轴的终点对齐。
  • center 副轴的中点对齐。
  • baseline Item的第一行文字的基线对齐。
    注意:如果有的Item没有文本基线,那么它的基线默认是左上角。

5.alignContent多根主轴对齐模式

  • stretch (默认值)轴线占满整个交叉轴。
  • flex_start 与副轴的起点对齐。
  • flex_end 与副轴的终点对齐。
  • center 与副轴的中点对齐。
  • space_between 与副轴两端对齐,轴线之间的间隔平均分布。
  • space_around 每根主轴线两侧的间隔都相等。轴线之间的间隔比轴线与边框的间隔大一倍。

三、FlexboxLayout子元素属性

1.layout_order 自身排列权重

给子元素加上该属性后,FlexboxLayout将按负值在前,正值在后,按照从小到大的顺序依次排列子元素。

2.layout_flexGrow 子元素瓜分剩余空间比重

该属性默认值为0,即不瓜分剩余空间。属性值越大,表示瓜分剩余空间比重越大。

3.layout_flexShrink 空间不足时子元素缩小比重

该属性默认值为1,即都缩小。属性值越大,表示缩小比例越大。属性值为0时表示不缩小该子元素。

4.layout_alignSelf 自身对齐方式

  • auto (默认)继承父元素的alignItems属性。
  • flex_start
  • center
  • baseline
  • stretch

5.layout_flexBasisPercent 自身占主轴空间百分比

属性值填”80%”之类的。

四、FlexboxLayoutManager的使用

1.设置RecyclerView的LayoutManager

1
2
3
4
5
6
FlexboxLayoutManager manager = new FlexboxLayoutManager(getContext());
//设置FlexboxLayoutManager的属性,相当于设置父容器属性
manager.setFlexDirection(FlexDirection.ROW);
...
recyclerView.setLayoutManager(manager);

2.设置ViewHolder的LayoutParams

1
2
3
4
5
6
7
ViewGroup.LayoutParams params = holder.itemView.getLayoutParams();
if (params instanceof FlexboxLayoutManager.LayoutParams) {
FlexboxLayoutManager.LayoutParams lp = (FlexboxLayoutManager.LayoutParams) params;
//设置子元素属性
lp.setFlexGrow(1f);
...
}

五、参考Demo

官方Demo非常详细,建议下载体验!

自定义View

一、重要回调方法

1.初始化时机选择

  • onFinishInflate 解析完xml后回调
  • onSizeChanged 组件大小发生改变时回调

2.塑形

  • onMeasure
  • onLayout
  • onDraw
  • setWillNotDraw
    • 该开关值为true时,android系统会对此View进行优化。
    • 重写onDraw方法的同时,最好在初始化时把这个开关关掉。

3.事件处理

  • dispatchTouchEvent
  • onInterceptTouchEvent
  • onTouchEvent
  • ViewParent#requestDisallowInterceptTouchEvent(boolean)