androidtextview刪除
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. 關於Android動態布局添加和刪除View的問題……
java">{
privateLinearLayoutlayout;
privateTextViewtextView;
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
layout=newLinearLayout(this);//變數layout是該Activity的成員變數(privateLinearLayoutlayout)
layout.setOrientation(LinearLayout.VERTICAL);//設置layout布局方向為垂直
setContentView(layout);
//接下來向layout中添加TextView
textView=newTextView(this);
textView.setText("ThisIsaTextView");
layout.addView(textView);
}
@Override
protectedvoidonResume(){
//TODOAuto-generatedmethodstub
layout.removeView(textView);
super.onResume();
}
}
但是Activity在啟動的時候調用onCreate()之後也會調用onResume()方法,所以進入程序也看不到textview了