AndroidSpannableString(顯示多樣式文字)
SpannableString與String相似,是一種字串型別,TextView可以直接設定Spannable為顯示文字,不相同的是,SpannableString可以使用setSpan方法實現字串各種形式風格的顯示,並且可以設定指定的區間。
setSpan(Object what, int start, int end, int flags)方法需要使用者輸入四個引數,what表示設定的格式是什麼,可以是前景色、背景色也可以是可點選的文字等等(URLSpan、ClickableSpan、BackgroundColorSpan、ForegroundColorSpan、MaskFilterSpan、AbsoluteSizeSpan、RelativeSizeSpan、ImageSpan、ScaleXSpan、StyleSpan、SubscriptSpan、SuperscriptSpan、TextAppearanceSpan、TypefaceSpan、RasterizerSpan、StrikethroughSpan、UnderlineSpan)。MaskFilterSpan可以實現模糊和浮雕效果,RasterizerSpan可以實現光柵效果。start表示需要設定格式的子字串的起始下標,同理end表示終了下標,flags屬性就有意思了,共有四種屬性:
- Spanned.SPAN_INCLUSIVE_INCLUSIVE:前後都包括
- Spanned.SPAN_EXCLUSIVE_EXCLUSIVE:前後都不包括
- Spanned.SPAN_INCLUSIVE_EXCLUSIVE:前面包括,後面不包括
- Spanned.SPAN_EXCLUSIVE_INCLUSIVE:前面不包括,後面包括
SpannableStringBuilder實現對SpannableString的一個拼接效果,append()方法可以實現各種風格效果的SpannableString拼接,非常實用。
例項程式碼
- activity.xml檔案
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:layout_marginTop="10dp"
tools:context="com.mazaiting.spannablestring.MainActivity"
>
<TextView
android:id="@+id/textView"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
>
<Button
android:onClick="foreGroundColor"
android:text="前景色"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
/>
<Button
android:onClick="backGroundColor"
android:text="背景色"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
/>
<Button
android:onClick="relativeSize"
android:text="字型大小"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
/>
<Button
android:onClick="strikeThrough"
android:text="刪除線"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
>
<Button
android:onClick="underLine"
android:text="下劃線"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
/>
<Button
android:onClick="superScript"
android:text="上標"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
/>
<Button
android:onClick="subScript"
android:text="下標"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
/>
<Button
android:onClick="styleSpan"
android:text="粗體斜體"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
>
<Button
android:onClick="imageSpan"
android:text="圖片"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
/>
<Button
android:onClick="click"
android:text="點選"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
/>
<Button
android:onClick="urlSpan"
android:text="URL"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
/>
<Button
android:onClick="styleSpan"
android:text="粗體斜體"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
/>
</LinearLayout>
</LinearLayout>
- MainActivity.java程式碼
package com.mazaiting.spannablestring;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.TextPaint;
import android.text.method.LinkMovementMethod;
import android.text.style.BackgroundColorSpan;
import android.text.style.ClickableSpan;
import android.text.style.ForegroundColorSpan;
import android.text.style.ImageSpan;
import android.text.style.RelativeSizeSpan;
import android.text.style.StrikethroughSpan;
import android.text.style.StyleSpan;
import android.text.style.SubscriptSpan;
import android.text.style.SuperscriptSpan;
import android.text.style.URLSpan;
import android.text.style.UnderlineSpan;
import android.util.TypedValue;
import android.view.View;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private TextView textView;
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) this.findViewById(R.id.textView);
}
/**
* 設定前景色
*/
public void foreGroundColor(View view){
SpannableString spannableString = new SpannableString("設定文字的前景色為淡藍色");
ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(Color.parseColor("#0099EE"));
spannableString.setSpan(foregroundColorSpan, 9, spannableString.length(),
Spanned.SPAN_INCLUSIVE_INCLUSIVE);
textView.setText(spannableString);
}
/**
* 設定背景色
*/
public void backGroundColor(View view){
SpannableString spannableString = new SpannableString("設定文字的背景色為淺綠色");
BackgroundColorSpan backgroundColorSpan = new BackgroundColorSpan(Color.parseColor("#AC00FF30"));
spannableString.setSpan(backgroundColorSpan, 9, spannableString.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
textView.setText(spannableString);
}
/**
* 設定文字大小
*/
public void relativeSize(View view){
SpannableString spannableString = new SpannableString("萬丈高樓平地起");
RelativeSizeSpan relativeSizeSpan1 = new RelativeSizeSpan(1.2f);
RelativeSizeSpan relativeSizeSpan2 = new RelativeSizeSpan(1.4f);
RelativeSizeSpan relativeSizeSpan3 = new RelativeSizeSpan(1.6f);
RelativeSizeSpan relativeSizeSpan4 = new RelativeSizeSpan(1.8f);
RelativeSizeSpan relativeSizeSpan5 = new RelativeSizeSpan(1.6f);
RelativeSizeSpan relativeSizeSpan6 = new RelativeSizeSpan(1.4f);
RelativeSizeSpan relativeSizeSpan7 = new RelativeSizeSpan(1.2f);
spannableString.setSpan(relativeSizeSpan1, 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableString.setSpan(relativeSizeSpan2, 1, 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableString.setSpan(relativeSizeSpan3, 2, 3, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableString.setSpan(relativeSizeSpan4, 3, 4, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableString.setSpan(relativeSizeSpan5, 4, 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableString.setSpan(relativeSizeSpan6, 5, 6, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableString.setSpan(relativeSizeSpan7, 6, 7, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(spannableString);
}
/**
* 設定刪除線
*/
public void strikeThrough(View view){
SpannableString spannableString = new SpannableString("為文字設定刪除線");
StrikethroughSpan strikethroughSpan = new StrikethroughSpan();
spannableString.setSpan(strikethroughSpan, 5, spannableString.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
textView.setText(spannableString);
}
/**
* 設定下劃線
*/
public void underLine(View view){
SpannableString spannableString = new SpannableString("為文字設定下劃線");
UnderlineSpan underlineSpan = new UnderlineSpan();
spannableString.setSpan(underlineSpan, 5, spannableString.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
textView.setText(spannableString);
}
/**
* 設定上標
*/
public void superScript(View view){
SpannableString spannableString = new SpannableString("為文字設定上標");
SuperscriptSpan superscriptSpan = new SuperscriptSpan();
spannableString.setSpan(superscriptSpan, 5, spannableString.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
textView.setText(spannableString);
}
/**
* 設定下標
*/
public void subScript(View view){
SpannableString spannableString = new SpannableString("為文字設定下標");
SubscriptSpan subscriptSpan = new SubscriptSpan();
spannableString.setSpan(subscriptSpan, 5, spannableString.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
textView.setText(spannableString);
}
/**
* 設定粗體斜體
*/
public void styleSpan(View view){
SpannableString spannableString = new SpannableString("為文字設定粗體、斜體風格");
StyleSpan styleSpan_B = new StyleSpan(Typeface.BOLD);
StyleSpan styleSpan_I = new StyleSpan(Typeface.ITALIC);
spannableString.setSpan(styleSpan_B, 5, 7, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
spannableString.setSpan(styleSpan_I, 8, 10, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
textView.setText(spannableString);
}
/**
* 設定圖片
*/
public void imageSpan(View view){
SpannableString spannableString = new SpannableString("在文字中新增表情(表情)");
Drawable drawable = getResources().getDrawable(R.mipmap.emotion);
drawable.setBounds(0, 0, 42, 42);
ImageSpan imageSpan = new ImageSpan(drawable);
spannableString.setSpan(imageSpan, 6, 8, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
textView.setText(spannableString);
}
/**
* 點選開啟新介面
*/
public void click(View view){
SpannableString spannableString = new SpannableString("為文字設定點選事件");
MyClickableSpan clickableSpan = new MyClickableSpan("http://www.jianshu.com/");
spannableString.setSpan(clickableSpan, 5, spannableString.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
// 使用ClickableSpan的文字如果想真正實現點選作用,
// 必須為TextView設定setMovementMethod方法,否則沒有點選相應,
// 至於setHighlightColor方法則是控制點選是的背景色。
textView.setMovementMethod(LinkMovementMethod.getInstance());
textView.setHighlightColor(Color.parseColor("#36969696"));
textView.setText(spannableString);
}
class MyClickableSpan extends ClickableSpan {
private String content;
public MyClickableSpan(String content) {
this.content = content;
}
@Override public void updateDrawState(TextPaint ds) {
ds.setUnderlineText(false);
}
@Override public void onClick(View widget) {
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
Bundle bundle = new Bundle();
bundle.putString("content", content);
intent.putExtras(bundle);
startActivity(intent);
}
}
/**
* 網路連結
*/
public void urlSpan(View view) {
SpannableString spannableString = new SpannableString("為文字設定超連結");
URLSpan urlSpan = new URLSpan("http://www.jianshu.com/");
spannableString.setSpan(urlSpan, 5, spannableString.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
textView.setMovementMethod(LinkMovementMethod.getInstance());
textView.setHighlightColor(Color.parseColor("#36969696"));
textView.setText(spannableString);
}
}
注: 文章中涉及到的Activity即一個空的Activity, 讀者可以可以新建一個空介面即可。
相關文章
- EXCEL函式之:SEARCH() SEARCHB() --怎樣將文字和數字分列顯示Excel函式
- CSS文字省略顯示CSS
- 超出文字顯示省略號,hover效果:文字滾動顯示==》求解
- 常用CSS樣式1:文字樣式CSS
- WebView 顯示HTML富文字WebViewHTML
- Gridview表頭(跨行、跨列)顯示樣式!View
- css使文字顯示兩行後顯示省略號CSS
- Geoserver + MySQL實現圖層顯示和文字顯示ServerMySql
- 1.5 常用CSS樣式1:文字樣式CSS
- Win10系統如何設定多臺顯示器不同的縮放樣式Win10
- DcatAdmin行操作按鈕樣式調整(圖示+文字)
- iOS設定tabbar不顯示文字,只顯示圖片iOStabBar
- 用CSS樣式實現顯示隱藏層 (轉)CSS
- Css基本樣式————文字CSS
- Android Libgdx 顯示文字Android
- webView文字長按顯示英文WebView
- TextView搜尋文字高亮顯示TextView
- css一行顯示文字CSS
- Bartender 4:圖示顯示切換大變樣,還能在選單欄自定義文字
- css文字溢位顯示省略號CSS
- CSS 設定文字樣式CSS
- CSS input文字框樣式CSS
- CSS input 文字框樣式CSS
- CSS系列:CSS文字樣式CSS
- vue顯示多個空格Vue
- win10 2004怎樣開啟多屏顯示功能 win10開啟多屏顯示功能的步驟Win10
- Python Flask+Pandas讀取excel顯示到html網頁: CSS控制表格樣式、表頭文字居中PythonFlaskExcelHTML網頁CSS
- 直播網站原始碼,CardView如何顯示出底背景樣式?網站原始碼View
- Android 自定義Toast,修改Toast樣式和顯示時長AndroidAST
- 如何控制手機網站控制狀態列顯示樣式網站
- 用CSS來改變網頁滑鼠顯示樣式的方法CSS網頁
- [20160325]bbed 中文字元顯示的顯示問題字元
- CSS——CSS 給文字加樣式:② 文字屬性CSS
- CSS——文字超出隱藏顯示省略號CSS
- Linux基礎命令---顯示文字lookLinux
- Linux基礎命令---tail顯示文字LinuxAI
- Linux基礎命令—文字顯示odLinux
- Linux基礎命令—文字顯示cutLinux