A. android TextView使用及性能優化
TextView 是Android中最常用的控制項,在這里記錄下TextView 的用法;
在Android中可以使用系統自帶的4種字體:
在XML中使用 android:typeface="normal" 進行設置
將字體文件放到main/assets/fonts目錄下,使用Asset讀取字體後進行設置
使用 android:drawableLeft="@mipmap/ic_launcher" 可以設置一張圖片顯示在文字的上下左右,減少布局層級
使用Span能夠在一段TextView中設置不同顏色的字體,鏈接,圖片等內容
使用ClickableSpan 能夠設置一段文字的點擊事件
創建自己的MyClickableSpan:
之後使用SpannableStringBuilder來創建字元串,並使用setSpan來為字元串的一部分設置Span對象
其中setSpan()方法的最後一個參數標識有以下常量,這些常量標識著在 對SpannableStringBuilder進行insert時 添加的字元適用的規則:
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
Spanned.SPAN_EXCLUSIVE_INCLUSIVE
Spanned.SPAN_INCLUSIVE_EXCLUSIVE
Spanned.SPAN_INCLUSIVE_INCLUSIVE
前一個 EXCLUSIVE / INCLUSIVE 標識著在設置了Span的一段字元之前(緊挨著)插入字元時,被不被包含到Span范圍中, EXCLUSIVE 表示包含, INCLUSIVE 表示不包含;
第二個 EXCLUSIVE / INCLUSIVE 同理表示插入這段字元之後的效果;
ImageSpan用於在TextView中插入圖片,可以用來實現圖文混排
使用方法:
這樣實現的效果是文字與圖片底部進行對齊,如果需要圖片中線與文字中線對其,需要自己重寫ImageSpan
Android 中的TextView中存在著很多EditText中的特性,在setText()方法中會涉及到很多Span相關的操作,比如設置TextWatcher,重新構造Spannable等操作,在我們僅僅顯示靜態文本的時候這些操作都是沒有必要的(通過使用普通的TextView進行Debug來驗證普通的TextView的確是Span的);
在大量顯示靜態文本的時候就可以通過StaticLayout來計算出TextView的布局信息,這項工作可以放到非UI線程來進行,能夠減少在setText()的時候UI線程的耗時,達到優化TextView性能的目的;
StaticLayout是TextView中用於顯示多行靜態文本的Layout,也是能夠支持SpannableString的,只是不能在Span變化之後重新Layout,所以在大部分場景下已經適用;
通過這個自定義的View來顯示Text,在onDraw()的時候直接使用layout來進行繪制,而設置需要顯示的文本則直接使用setLayout()來實現
使用下面給出的參考鏈接中的測試Demo在 ZTE A2017 Android7.1.1 高通820設備上,普通TextView在ListView中連續滾動的幀數是55幀,使用StaticLayout的結果為60幀
可以作為在APP使用CPU資源較多的情況下的優化手段
參考鏈接: TextView預渲染研究
在Android中,TextView的測量消耗了大量的時間,Android P中提供了PrecomputedText能夠將測量這個過程放到後台來執行,減輕對於UI線程的卡頓;
非Android P時,使用AppCompatTextView控制項,使用setTextFeature()方法來將文本的measure過程放到其他線程來執行,而不是直接將text應用於TextView;
在調用了這個方法之後如果對TextView進行邊距,文字大小等的設置都將會報錯;
Prefetch Text Layout in RecyclerView
PrecomputedTextCompat
在ListView中僅替換設置Text的方法時未測試出性能與普通方法有什麼優勢,猜測是ListView沒有在getView和顯示之間預留時間,
測試項目地址:
https://github.com/GavynZhang/PrecomuptedTextViewTest
B. Carson帶你學Android:手把手教你寫一個完整的自定義View
自定義View一共分為兩大類,具體如下圖:
對於自定義View的類型介紹及使用場景如下圖:
在使用自定義View時有很多注意點(坑),希望大家要非常留意:
View的內部本身提供了post系列的方法,完全可以替代Handler的作用,使用起來更加方便、直接。
主要針對View中含有線程或動畫的情況: 當View退出或不可見時,記得及時停止該View包含的線程和動畫,否則會造成內存泄露問題 。
當View帶有滑動嵌套情況時,必須要處理好滑動沖突,否則會嚴重影響View的顯示效果。
接下來,我將用自定義View中最常用的 繼承View 來說明自定義View的具體應用和需要注意的點
在下面的例子中,我將講解:
下面我將逐個步驟進行說明:
步驟1:創建自定義View類(繼承View類)
特別注意:
步驟2:在布局文件中添加自定義View類的組件及顯示
至此,一個基本的自定義View已經實現了,運行效果如下圖。
接下來繼續看自定義View關於屬性自定義的問題:
先來看wrap_content & match_parent屬性的區別
如果不手動設置支持 wrap_content 屬性,那麼 wrap_content 屬性是不會生效(顯示效果同 match_parent )
padding 屬性:用於設置控制項內容相對控制項邊緣的邊距;
如果不手動設置支持padding屬性,那麼padding屬性在自定義View中是不會生效的。
繪制時考慮傳入的padding屬性值(四個方向)。
除了常見的以android:開頭的系統屬性(如下所示),很多場景下自定義View還需要系統所沒有的屬性,即自定義屬性。
實現自定義屬性的步驟如下:
下面我將對每個步驟進行具體介紹
對於自定義屬性類型 & 格式如下:
至此,一個較為規范的自定義View已經完成了。
Carson_Ho的github: 自定義View的具體應用
不定期分享關於 安卓開發 的干貨,追求 短、平、快 ,但 卻不缺深度 。
C. android 自定義View 使用 DataBinding 筆記
在 build.gradle 文件中添加配置
系統會根據布局文件名稱自動生成相應的 DataBinding 類,例如
布局文件 activity_main.xml 會生成 ActivityMainBinding 類 ,類名生成規則為駝峰命名: 文件名(首字母大寫) + Binding
activity 中使用:
fragment 中使用:
這里 android:text="@{viewmodel.text}" 對text進行設置
在 Edittext 中可以使用 android:text="@={viewmodel.text}" 進行雙向綁定,關鍵是這個 = 號;
若需要在xml布局文件中使用系統類的屬性,則需要引入.例:
通過引入 <import type="android.view.View"/> 可以使用 View.VISIBLE 、 View.GONE 屬性
有時候自定義view要用DataBinding時需要通過 @BindingAdapter 設置
單向綁定設置比較簡單 @BindingAdapter("app:paramA") 方法名為 setParamA ,單向綁定嘛就是傳入參數:
雙向綁定 set 、 get 方法,最主要的是 setListeners 方法,名字可以隨意,只是 @BindingAdapter 中是 "app:paramBAttrChanged" ,在屬性後面跟上 AttrChanged , attrChange 為通知系統內容變更的回調,當在 MineView 內部 paramB 發生變更時,通過 attrChange 去通知對 paramB 進行綁定的對象更新自己緩存中的內容 如:
希望對您有幫助.
D. android自定義view要怎麼使用
視圖,凡事能被用戶看到的小控制項都是一種view,也可以自定義view
E. Android View如何獲取焦點
Android 中的view使用requestFocus()焦點具體的方法如下:1.view.setFocusable(true);2.view.setFocusableInTouchMode(true);然後調用 requestFocus()即可獲取焦點。Android View如何獲取焦點