my first boke
TextView使用技術點(一)
TextView使用技術點(一) 2017年04月18日 11:46:11 GJianAJ 閱讀數:5452 標籤: TextView 文字 Android View 更多 個人分類: Android開發收穫 所屬專欄: android小菜 版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/jinjin10086/article/details/70225467 TextView作為開發時候顯示最常用的控制元件之一,我們使用的頻率是非常高的,但是我們平時的使用都是怎麼使用的那些相關的屬性和方法呢?
內容:setText()
字型:TextSize、TextColor
寬度和高度:width、weigth
邊距:margin、padding
背景:background
……
常用的基本也就這些吧。
雖然基本都用,但是我們真的瞭解這些屬性和相關的方法,今天我們就從原始碼角度看看Text相關的設定。
當我們實現如下相關的需求時候,我們是怎麼做的呢 ?
1)設定Text的時候資料為String,char[],字串資源。
2)在原有Text顯示基礎上追加特定的內容。
3)設定字型大小的時候指定單位,SP、DP、PT等。
4)設定內容的選中效果。
5)顯示內容中的中間某個字型顏色、大小變化。
…
這些效果該怎麼實現呢?
一、首先看第一個問題設定不同的資料為顯示內容:
從截圖可以看出,設定文字內容的時候共有五個過載方法均可設定內容,第一個方法也就是我們最常用的方法設定內容,
第二個方法帶的引數為快取顯示的型別 總共三種類型,
原始碼部分如下:
public enum BufferType { NORMAL, SPANNABLE, EDITABLE, } 呼叫第一個方法的時候BufferType預設為normal,如下:
public final void setText(CharSequence text) { setText(text, mBufferType); } 其實就是間接呼叫了第二個方法。 第三個方法就是將字元陣列設定為內容的方法,包含開始、結束下標,可以顯示指定的內容。
最後兩個方法類似前兩個,只是多了一步取資源字串的操作。
其實多個方法否是在不同的轉換之後呼叫了設定內容的終極方法,:
private void setText(CharSequence text, BufferType type, boolean notifyBefore, int oldlen) 第一個問題解決了,通過呼叫不同的過載方法就可以實現相關的操作,很簡單,就不上圖了。
二、接著看第二個問題在Text原有顯示基礎上追加顯示的內容:
從上述的bufferType可以看出內容的型別有三種,這裡就是用到了
EDITABLE TextView存在方法append();
可以看出有兩個過載方法,一個是全部追加,一個是追加指定的內容,其實猜也能猜到了第一個方法就是呼叫的第二個方法,引數就是0和字串的長度,看原始碼,果然如此:
public final void append(CharSequence text) { append(text, 0, text.length()); } 再看追加的具體實現:
public void append(CharSequence text, int start, int end) { if (!(mText instanceof Editable)) { setText(mText, BufferType.EDITABLE);//如果不是EDITABLE型別設定成此型別 }
((Editable) mText).append(text, start, end);
if (mAutoLinkMask != 0) {
boolean linksWereAdded = Linkify.addLinks((Spannable) mText, mAutoLinkMask);
// Do not change the movement method for text that support text selection as it
// would prevent an arbitrary cursor displacement.
if (linksWereAdded && mLinksClickable && !textCanBeSelected()) {
setMovementMethod(LinkMovementMethod.getInstance());
}
}
} 其實就是講內容設定成EDITABLE型別了, 其實是給Editable在追加內容,Editable是繼承於CharSequence的一個介面,對其進行了擴充套件,可進行追加等操作。
原始碼先看到這裡,基本明白了是怎麼實現的,暫不深究。
看看我們的實現程式碼,其實很簡單:
mTextView1.setText(“預設單位為SP”); mTextView2.setText(“單位為DP/DIP”); mTextView1.append(“追加資訊”,0,2); mTextView2.append(“追加資訊”); 顯示如下:
可以看出已經進行了指定的追加效果。
三、接著看第三個問題設定字型大小的時候指定單位:
先看看設定字型大小的方法,如下:
有兩個過載方法,和上述一樣的呼叫模式,就不用細看了,需要說明的是指定的引數預設為SP,即可以隨著系統的設定調整大小的字型單位。
重點看我們都可以設定那些單位,原始碼如下:
/** * Set the default text size to a given unit and value. See {@link * TypedValue} for the possible dimension units. * * @param unit The desired dimension unit. * @param size The desired size in the given units. * * @attr ref android.R.styleable#TextView_textSize */ public void setTextSize(int unit, float size) { Context c = getContext(); Resources r;
if (c == null)
r = Resources.getSystem();
else
r = c.getResources();
setRawTextSize(TypedValue.applyDimension(
unit, size, r.getDisplayMetrics()));
} 這裡直接看不出什麼,但是注意TypedValue.applyDimension(unit, size, r.getDisplayMetrics()),不論設定什麼單位都會進行這一步的轉換,再看看轉換的方法內部:
public static float applyDimension(int unit, float value, DisplayMetrics metrics) { switch (unit) { case COMPLEX_UNIT_PX://畫素 return value; case COMPLEX_UNIT_DIP://DP,不會隨著系統設定而變化 return value * metrics.density; case COMPLEX_UNIT_SP://SP,會隨著系統設定而變化 return value * metrics.scaledDensity; case COMPLEX_UNIT_PT://點 return value * metrics.xdpi * (1.0f/72); case COMPLEX_UNIT_IN://英寸 return value * metrics.xdpi; case COMPLEX_UNIT_MM://毫米 return value * metrics.xdpi * (1.0f/25.4f); } return 0; } 一目瞭然,我們可設定的單位有6種,除此之外會直接返回尺寸為0。
再看看6中單位,常用的位DP,SP,由於Android的碎片化很嚴重,其他的單位也很少用到。
到這裡也就明白了該怎麼設定字型大小了。
看看具體設定的效果,如下:
mTextView1.setText(“預設單位為SP”); mTextView2.setText(“單位為DP/DIP”); mTextView3.setText(“單位為PX”); mTextView4.setText(“單位為PT”); mTextView5.setText(“單位為毫米”); mTextView6.setText(“單位為英寸”); //預設為SP mTextView1.setTextSize(14); //單位為DP/DIP mTextView2.setTextSize(TypedValue.COMPLEX_UNIT_DIP,14); //單位為PX mTextView3.setTextSize(TypedValue.COMPLEX_UNIT_PX,14); //單位為PT mTextView4.setTextSize(TypedValue.COMPLEX_UNIT_PT,14); //單位為毫米 mTextView5.setTextSize(TypedValue.COMPLEX_UNIT_MM,1); //單位為英寸 mTextView6.setTextSize(TypedValue.COMPLEX_UNIT_IN,1); 顯示如下:
四、接著看第四個問題設定內容的選中效果:
從上述的bufferType可以看出內容的型別有三種,這裡就是用到了
SPANNABLE TextView並沒有直接的方法進行設定,此處暫時不做深究,實現程式碼如下:
mTextView1.setText(“預設單位為SP”, TextView.BufferType.SPANNABLE); mTextView2.setText(“單位為DP/DIP”, TextView.BufferType.SPANNABLE);
Spannable span=(Spannable)mTextView1.getText(); Spannable span1=(Spannable)mTextView2.getText(); span.setSpan(new BackgroundColorSpan(Color.YELLOW), 0, 2,Spannable.SPAN_COMPOSING ); span1.setSpan(new StyleSpan(Typeface.BOLD), 1, 3,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE ); 顯示如下:
可以看到預設加上了北京,下面的變成了粗體。
五、接著看第五個問題顯示內容中的中間某個字型顏色、大小變化:
這個問題還是通過setText方法來實現,藉助於Html類解析Html來實現,
程式碼如下:
mTextView1.setText(Html.fromHtml(“常用網站:百度、好123…”), TextView.BufferType.SPANNABLE); 顯示如下:
可以看到百度和好123均實現了紅色字型顯示。
以上的需求基本已經解決,不需要複雜的佈局,也不需要自定義View,TextView已經封裝好了。平時的開發中多研究原始碼對我們的開發以及發展都是有著諸多的益處的。
一基本單位介紹: dp(dip): device independent pixels(裝置獨立畫素). 不同裝置有不同的顯示效果,這個和裝置硬體有關,一般我們為了支援WVGA、HVGA和QVGA …
Android TextView常用用法總結 donkor_ 1875
TestView控制元件相信大家並不陌生。TestView其實就是用來顯示字串的元件,在手機上就是顯示一塊文字的區域。向用戶顯示文字,並可選擇允許他們編輯文字。本文主要講在實際開發過程中,我們經常需要用…
TextView 高階教程 zhaizu 5878
光看題目,估計有人已經忍不住吐槽了:尼瑪,裝X,TextView 這麼簡單的控制元件,還有什麼高階用法嗎?放在以前,我也會這麼想,但是隨著開發經驗的積累,我愈發覺得 TextView 簡直就是一座寶藏,裡…
TextView 你真的懂我麼 tfs080640234 1292
對於TextView,我想大家都已經熟的不能再熟了。但是它的用法我們真的熟麼?為了避免總是一言不合就去翻官方文件,在這裡我總結一下我也可能是你容易忽視的一些細節. 此文從別的部落格轉過來的,方便後續自…
TextView yangshangwei 3935
文字控制元件顯示富文字(URL、不同大小、字型、顏色的文字)在TextView中預定義了一些類似HTML標籤(不區分大小寫),通過這些標籤,我們可以使TextView控制元件顯示不同的顏色、大小、字型的文字。…
TextView實戰之你真的懂我麼? sdkfjksf 2萬
對於TextView,我想大家都已經熟的不能再熟了。但是它的用法我們真的熟麼?為了避免總是一言不合就去翻官方文件,在這裡我總結一下我也可能是你容易忽視的一些細節。…
Android自定義View(一、初體驗自定義TextView) u010163442 2.8萬
TextView的跑馬燈效果以及TextView的一些屬性 dl10210950 2萬
TextView應該是用的最廣的控制元件了,要是這句話不對我直播吃翔,這幾天的專案用到跑馬燈,居然忘記怎麼設定了,還要Google才能解決,看來雖然很基本的東西,但是用的少還是容易遺忘,所以我決定把它寫下…