今天再次學(xué)習(xí)了一下android中最常見的控件--TextView是使用與其屬性方法鸥滨。記錄下來阀溶,以免忘記停忿。
先看看使用TextView能實現(xiàn)些申明特殊的效果把:
圖1 textView實現(xiàn)跑馬燈效果
圖2 TextView實現(xiàn)解析簡單的html網(wǎng)頁
圖3 實現(xiàn)多個TextView的跑馬燈和折疊TextView
常見屬性設(shè)置
省略了必要設(shè)置的寬和、高屬性和常見的位置設(shè)置屬性腔彰。
android:text <!--設(shè)置文本內(nèi)容 后面是對應(yīng)的java--> setText();
android:textSize <!--設(shè)置文字的大小芍阎,推薦單位為dp--> setTextSize();
android:textColor <!--設(shè)置文字的顏色--> setTextColor();
android:textStyle <!--設(shè)置文字形狀--> setTextStyle();
android:typeface <!--設(shè)置文本字體世曾,normal,sans,serif,monospace--> setTypeface();
android:textScaleX <!--設(shè)置文字之間的間隔,默認為1.0f--> setTextScaleX();
android:background <!--設(shè)置背景顏色--> setBackgroundColor();
android:textColorLink <!--設(shè)置文字鏈接的顏色--> setTextColorLink();
android:lines <!--設(shè)置文本行數(shù)--> setLines();
android:singleLine <!--單行顯示,現(xiàn)在已經(jīng)不推薦使用--> setSingleLine();
TextView高級屬性設(shè)置
高級是不是高級我不知道谴咸,但是下面這些屬性我個人用的比較少:
android:autoLink //設(shè)置是否顯示為可點擊的鏈接轮听。可選值(none/web/email/phone/map/all)
android:drawableBottom //在text的下方輸出一個drawable(圖片)岭佳,同理可在上血巍、左右輸出圖片
android:drawablePadding //設(shè)置text與drawable(圖片)的間隔,需在有圖片的情況下使用珊随,否則無效
android:ellipsize //設(shè)置當文字過長時述寡,該控件該如何顯示柿隙。可設(shè)置如下屬性值:"start"省略號顯示在開頭;"end”省略號顯示在結(jié)尾;"middle"省略號顯示在中間; "marquee" 以跑馬燈的方式顯示(動畫橫向移動)
android:linksClickable //設(shè)置點擊時是否鏈接鲫凶,即使設(shè)置了autoLink
android:marqueeRepeatLimit //在ellipsize設(shè)定為marquee時禀崖,設(shè)置重復(fù)滾動的次數(shù),設(shè)置為marquee_forever時表示無限次螟炫。
android:shadowRadius //設(shè)置陰影的半徑波附。設(shè)置為0.1就變成字體的顏色了,一般設(shè)置為3.0的效果比較好
android:shadowColor //指定文本陰影的顏色不恭,需要與shadowRadius一起使用
TextView中使用富文本
我原本以為TextView只能用來顯示文字叶雹,后來發(fā)現(xiàn)TextView遠遠比想象的要強大的多,我們甚至可以用他來翻譯網(wǎng)頁』话桑現(xiàn)在讓我記錄下TextView是怎么解析html的吧:
相信大家都知道在java代碼中的setText()這個方法吧,我們可以在里面?zhèn)魅隒harSequence钥星,讓其在TextView中顯示出來沾瓦。在android中又有Html.fromHtml()可以將html轉(zhuǎn)化成CharSequence。所以谦炒,對Html進行最簡單的解析可以這樣寫:
mHtml = "<html><body>這里添加了超鏈接贯莺,點擊試試把<a ;
//此處省略了findViewById
mTextView.setText(Html.fromHtml(mHtml));
結(jié)果如圖:
圖4 簡單的html解析
是不是很簡單,但是點擊連接文本宁改,發(fā)現(xiàn)并沒有反應(yīng)缕探,這個因為我們還沒有為他設(shè)置響應(yīng)點擊事件,設(shè)置也很簡單还蹲,代碼如下:
mTextView.setMovementMethod(LinkMovementMethod.getInstance());//響應(yīng)html中的點擊事件
當解析的html比較多爹耗,一個頁面不能顯示完全時,可以設(shè)置滑動顯示:
mTextView.setMovementMethod(ScrollingMovementMethod.getInstance());// 滾動
好了谜喊,以為這樣就完了潭兽?No。TextView強大的功能還在后面呢斗遏。當html中有圖片時山卦,我們又該怎么解析呢?诵次?只需要重寫Html.fromHtml()中的ImageGetter方法账蓉,就可以添加圖片到TextView中進行顯示,是不是很神奇逾一?
例如铸本,我們對網(wǎng)絡(luò)圖片進行解析:可以這樣重寫ImageGetter()方法。
Html.ImageGetter mImgGetFormNetwork = new Html.ImageGetter() {
public Drawable getDrawable(String source) {
Drawable drawable = null;
URL url;
try {
url = new URL(source);
drawable = Drawable.createFromStream(url.openStream(), ""); //獲取網(wǎng)路圖片
} catch (Exception e) {
return null;
}
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable
.getIntrinsicHeight());
return drawable;
}
};
調(diào)用的時候可以這樣:
mTextView.setText(Html.fromHtml(mHtml1,mImgGetFormNetwork,null));
不過加載網(wǎng)絡(luò)圖片還不不建議直接放在主線程中嬉荆,放在主線程會導(dǎo)致UI阻塞归敬,強烈不推薦這么寫,可以考慮開一個線程來進行獲取圖片。
最后汪茧,想要你的程序運行椅亚,還需要添加網(wǎng)絡(luò)訪問權(quán)限:
<uses-permission android:name="android.permission.INTERNET" />
到現(xiàn)在,我們的TextView不但可以顯示文字舱污,還可以顯示圖片了呀舔。但是android中的html解析能力十分有限,當html中有不可識別的標簽時扩灯,我們又該怎么做呢媚赖?注意看,Html.fromHtml()珠插;中一共有三個參數(shù)惧磺,最后一個就是讓我們來解決不能識別的tag的。最后一個參數(shù)是TagHandler捻撑,我們只需要通過重寫TagHandker來識別自身的標簽磨隘,就可以達到正確解析的目的,那么怎么使用呢顾患?可以直接參考源博客http://blog.csdn.net/u010418593/article/details/9322197,也可以參考下面的代碼:
重寫TagHandler番捂,在這里我們對其不能解析的size標簽進行自定義解析:
/**
* Created by 24540 on 2016/11/9.
* 參考博客:http://blog.csdn.net/u010418593/article/details/9322197
*/
class SizeLabel implements Html.TagHandler {
private int size;
public SizeLabel(int size) {
this.size = size;
}
@Override
public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) {
/**
* 參數(shù):
* opening:為true時表示開始解析,為false時表示解析完
* tag:當前解析的標簽
* output:文本中的內(nèi)容
* xmlReader:xml解析器
**/
// 判斷當前解析的tag是否為size,并且已經(jīng)解析完畢(在沒有解析完畢之前output中沒有數(shù)據(jù))
if(tag.toLowerCase().equals("size") && !opening) {
// 通過output調(diào)用setSpan方法,改變文本的0下標到最后的下標的大小;
// 最后的參數(shù)用來標識在span范圍內(nèi)的文本前后輸入新的字符時是否也改變它們的效果;
Log.d("TAG","size里面的內(nèi)容在這里"+output);
output.setSpan(new AbsoluteSizeSpan(size), 0, output.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
}
回到MainActivity中,下面是我們的調(diào)用:
String html = "<font color='red' face='verdana'><size>自定義Html標簽</size>普通的大小</font>";
mText2.setText(Html.fromHtml(html,null,new SizeLabel(20)));
效果如下所示:
圖5 解析不能識別的tag
可以看出來江解,對size的解析符合我們的預(yù)想设预。
對上面的綜合運行,就可以解析出簡單的html頁面犁河,圖2就是我解析出來的一個簡答的html界面鳖枕。效果還可以吧~~。
TextView的其他效果
圖1的跑馬燈效果:只需要在xml文件中定義:
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/text_test"
android:ellipsize="marquee"
android:focusableInTouchMode="true"
android:focusable="true"
android:background="#00ff00"
android:textSize="20sp"
android:textColor="#3c44af"
android:textAppearance="?android:attr/textAppearanceLargeInverse"
android:marqueeRepeatLimit="marquee_forever"
android:text="這里實現(xiàn)跑馬燈效果,我先輸入很多很多的內(nèi)容呼股,一行不能顯示完全耕魄。"
android:singleLine="true"
/>
其中 android:ellipsize="marquee"、android:focusable="true"彭谁、android:singleLine="true"是實現(xiàn)跑馬燈的關(guān)鍵吸奴。
圖2中多個TextView的跑馬燈效果:
對圖1的實現(xiàn)效果簡單說明下,只有當TextView獲取焦點的時候缠局,‘a(chǎn)ndroid:focusable="true"’才能出現(xiàn)跑馬燈的效果则奥,當是當有多個TextView,用上述方法就行不同了狭园,因為我們無效同時獲取多個TExtView的焦點读处,從而會導(dǎo)致只有一個TextView才能實現(xiàn)跑馬燈的效果。想實現(xiàn)多個TextView的跑馬燈效果也很簡單唱矛,只需要重寫TextView默認獲取到焦點就可以了罚舱。
package students.textviewdemo;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.TextView;
/**
* Created by 24540 on 2016/11/9.
*/
public class HorseRaceLamp extends TextView{
public HorseRaceLamp(Context context) {
super(context);
}
public HorseRaceLamp(Context context, AttributeSet attrs) {
super(context, attrs);
}
public HorseRaceLamp(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public HorseRaceLamp(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr);
}
@Override
public boolean isFocused() {
return true;//在這里設(shè)置獲取焦點井辜,如此便可實現(xiàn)多個TextView的跑馬燈效果
}
}
在xml文件中進行引用就可以了:
<students.textviewdemo.HorseRaceLamp
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:singleLine="true"
android:text="這里要實現(xiàn)跑馬等效果,所以這里的內(nèi)容肯定不能太少了管闷,為此我在這里添加了很多沒用的內(nèi)容" />
<students.textviewdemo.HorseRaceLamp
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:paddingTop="10dp"
android:singleLine="true"
android:text="挫折時粥脚,要像大樹一樣,被砍了包个,還能再長刷允;也要像雜草一樣,雖讓人踐踏碧囊,但還能勇敢地活下去" />
很簡單把树灶。下面介紹怎么折疊TextView
因為個人感覺這樣寫還是不夠好,所以就不把代碼貼上來糯而,簡單的說下思路强缘。過兩天在琢磨一下芍殖,用更好的方式實現(xiàn)腊脱。
要實現(xiàn)折疊效果偿曙,肯定是需要一個TextView和一個Imageview的。當我們點擊ImageView時谜洽,對TextView的line進行設(shè)置。再次點擊還原設(shè)置即可實現(xiàn)這樣的效果吴叶。
---優(yōu)雅的代碼估計應(yīng)該可以在一周內(nèi)更新阐虚。