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

相關文章
相關標籤/搜索