
方案:通过spannablestring实现textview的丰富调控
Note:
1. 文本中的空格可通过 <string name=”blank_space”>    img</string>实现
参考代码如下:
001 | import java.io.IOException; |
003 | import org.xmlpull.v1.XmlPullParserException; |
005 | import android.app.Activity; |
006 | import android.content.res.ColorStateList; |
007 | import android.content.res.XmlResourceParser; |
008 | import android.graphics.Bitmap; |
009 | import android.graphics.BitmapFactory; |
010 | import android.graphics.Color; |
011 | import android.graphics.drawable.Drawable; |
012 | import android.os.Bundle; |
013 | import android.text.SpannableString; |
014 | import android.text.Spanned; |
015 | import android.text.method.LinkMovementMethod; |
016 | import android.text.style.AbsoluteSizeSpan; |
017 | import android.text.style.BackgroundColorSpan; |
018 | import android.text.style.BulletSpan; |
019 | import android.text.style.DrawableMarginSpan; |
020 | import android.text.style.ForegroundColorSpan; |
021 | import android.text.style.IconMarginSpan; |
022 | import android.text.style.ImageSpan; |
023 | import android.text.style.RelativeSizeSpan; |
024 | import android.text.style.ScaleXSpan; |
025 | import android.text.style.StrikethroughSpan; |
026 | import android.text.style.StyleSpan; |
027 | import android.text.style.SubscriptSpan; |
028 | import android.text.style.SuperscriptSpan; |
029 | import android.text.style.TextAppearanceSpan; |
030 | import android.text.style.TypefaceSpan; |
031 | import android.text.style.URLSpan; |
032 | import android.text.style.UnderlineSpan; |
033 | import android.widget.TextView; |
035 | public class TextViewLinkActivity extends Activity { |
036 | TextView mTextView = null ; |
037 | SpannableString msp = null ; |
039 | /** Called when the activity is first created. */ |
041 | public void onCreate(Bundle savedInstanceState) { |
042 | super .onCreate(savedInstanceState); |
043 | setContentView(R.layout.main); |
045 | mTextView = (TextView)findViewById(R.id.myTextView); |
048 | msp = new SpannableString( "字体测试字体大小一半两倍前景色背景色正常粗体斜体粗斜体下划线删除线x1x2电话邮件网站短信彩信地图X轴综合/bot" ); |
051 | msp.setSpan( new TypefaceSpan( "monospace" ), 0 , 2 , Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); |
052 | msp.setSpan( new TypefaceSpan( "serif" ), 2 , 4 , Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); |
055 | msp.setSpan( new AbsoluteSizeSpan( 20 ), 4 , 6 , Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); |
056 | msp.setSpan( new AbsoluteSizeSpan( 20 , true ), 6 , 8 , Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); |
059 | msp.setSpan( new RelativeSizeSpan( 0 .5f), 8 , 10 , Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); |
060 | msp.setSpan( new RelativeSizeSpan( 2 .0f), 10 , 12 , Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); |
063 | msp.setSpan( new ForegroundColorSpan(Color.MAGENTA), 12 , 15 , Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); |
066 | msp.setSpan( new BackgroundColorSpan(Color.CYAN), 15 , 18 , Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); |
069 | msp.setSpan( new StyleSpan(android.graphics.Typeface.NORMAL), 18 , 20 , Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); |
070 | msp.setSpan( new StyleSpan(android.graphics.Typeface.BOLD), 20 , 22 , Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); |
071 | msp.setSpan( new StyleSpan(android.graphics.Typeface.ITALIC), 22 , 24 , Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); |
072 | msp.setSpan( new StyleSpan(android.graphics.Typeface.BOLD_ITALIC), 24 , 27 , Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); |
075 | msp.setSpan( new UnderlineSpan(), 27 , 30 , Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); |
078 | msp.setSpan( new StrikethroughSpan(), 30 , 33 , Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); |
081 | msp.setSpan( new SubscriptSpan(), 34 , 35 , Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); |
082 | msp.setSpan( new SuperscriptSpan(), 36 , 37 , Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); |
085 | msp.setSpan( new URLSpan( "tel:4155551212" ), 37 , 39 , Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); |
086 | msp.setSpan( new URLSpan( "mailto:webmaster@google.com" ), 39 , 41 , Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); |
087 | msp.setSpan( new URLSpan( "http://www.baidu.com" ), 41 , 43 , Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //网络 |
088 | msp.setSpan( new URLSpan( "sms:4155551212" ), 43 , 45 , Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); |
089 | msp.setSpan( new URLSpan( "mms:4155551212" ), 45 , 47 , Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); |
090 | msp.setSpan( new URLSpan( "geo:38.899533,-77.036476" ), 47 , 49 , Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); |
093 | msp.setSpan( new ScaleXSpan( 2 .0f), 49 , 51 , Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); |
096 | ColorStateList csllink = null ; |
097 | ColorStateList csl = null ; |
098 | XmlResourceParser xppcolor=getResources().getXml (R.color.color); |
100 | csl= ColorStateList.createFromXml(getResources(),xppcolor); |
101 | } catch (XmlPullParserException e){ |
104 | } catch (IOException e){ |
109 | XmlResourceParser xpplinkcolor=getResources().getXml(R.color.linkcolor); |
111 | csllink= ColorStateList.createFromXml(getResources(),xpplinkcolor); |
112 | } catch (XmlPullParserException e){ |
115 | } catch (IOException e){ |
119 | msp.setSpan( new TextAppearanceSpan( "monospace" ,android.graphics.Typeface.BOLD_ITALIC, 30 , csl, csllink), 51 , 53 , Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); |
122 | msp.setSpan( new BulletSpan(android.text.style.BulletSpan.STANDARD_GAP_WIDTH,Color.GREEN), 0 ,msp.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); |
125 | Drawable drawable = getResources().getDrawable(R.drawable.icon); |
126 | drawable.setBounds( 0 , 0 , drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); |
127 | msp.setSpan( new ImageSpan(drawable), 53 , 57 , Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); |
129 | mTextView.setText(msp); |
130 | mTextView.setMovementMethod(LinkMovementMethod.getInstance()); |
来自 :
http://www.oschina.net/question/157182_49387