android自定义选词填空view

事例介绍

记得之前很容易写出一个自定义view,若是很长时间没有写,是很容易生疏的,通常自定义view有组合的viewgroup,有从最小单元的view入手,而此次要写的自定义选词填空view是从view出发的,在作以前也搜过相关的view,大部分都是从textview的span入手的,可是textview的span写的话,会遇到各类问题,很可贵去扩展,所以下定决心本身要写一个跟本身产品相关的选词填空view。先直接看作出来的效果: android

在这里分为两种类型的选词填空题,分为解析类和作题类,解析类只会显示答案的正确与否,作题类型会直接把选项填上去的场景。而在作题类会有两种状况:git

  • 选项少于空格:这种是选项选了以后还能够选择
  • 选项多余空格:这种是选项选了以后不能选择

实现的功能:

  • 能实现空格的选中
  • 切换选中的空格
  • 优先将选项填到选中的空格,若是没有选中的空格,则默认从第一个空格开始
  • 若是该空格已经有答案填了,则再次选中该空格的时候会还原该空格的答案,还原选项的是否可选的状态。

大概的逻辑就是上面几点了,虽说是很清楚,可是自定义view会涉及到文字的换行,下划线的换行,非答案的文字测量,答案的文字测量,下划线的测量,而下划线的测量是根据有没有答案来测量的,在有答案的时候,会根据答案的长度来绘制下划线的,没有答案的时候,会给下划线一个默认的长度。github

关于文字的测量有:

  • 先根据paint.breakText方法算出当前宽度内能容纳几个文字,该方法会返回wordCount数量
  • 紧接着根据string的substring截取文字
  • 将截取的文字添加到文字的集合中

绘制:

  • 因为上面已经算出了每一行文字的信息,所以在绘制过程当中直接取文字的集合,遇到文字绘制文字,遇到下划线绘制下划线。

触摸:

  • 因为须要交互,所以重写了onTouch的up事件,在up的时候先获取到是否点击了下划线部分,若是点击了则判断该处时候已经选了答案,若是选择了则重置答案,不然选中该处的下划线部分。
  • 触摸选项的时候会遍历下划线,若是有选中的下划线部分,则直接填充答案给该下划线部分,若是没有选中的下划线,则直接遍历下划线集合,找到了没有答案的下划线的时候,直接将选中的选项填充到该下划线部分。

是否onMeasure过程:bash

  • 在填充行信息的时候,会记录住上次的view的总高度,若是当前和上次的总高度发生了变化,则进行requestLayout,不然直接invalidate
  • 在onMeasure的时候,主要是在mode为非exactly的时候须要从新设置了高度和宽度。

使用:

  • 若是想直接有流失布局的选项样式直接用:
<com.xc.blank.BlankRootView
    android:id="@+id/blank_root_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />
复制代码

若是想本身定义选项的view那你能够直接定义BlankView:布局

<com.xc.blank.BlankView
    android:id="@+id/blankView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginLeft="@dimen/dp_23"
    android:layout_marginTop="20dp"
    android:layout_marginRight="@dimen/dp_16"/>
复制代码

后期会考虑加入自定义属性!!!spa

若是想第一时间看demo效果扫描下面二维码:code

github地址:进入cdn

相关文章
相关标签/搜索