您的位置:首页 > Web前端 > HTML

论TextView的超链接使用、显示表情、Html语法支持、跑马灯效果的实现

2016-03-12 17:41 651 查看
传送门:在Android實作HTML
TextView與AutoLink使用的建議方式

Android的TextView除了可以显示文字,还可以使用HTML语法来调整文字样式,无需特地使用WebView。

textView.setText(Html.fromHtml("HTML语法字符串"));


小白普及:另外,需要学习HTML语言(tv1)

<font>
-设置颜色与字体


<big>
-设置大号字体


<small>
-设置小号字体


<i>\<b>
-设置斜体、粗体


<a>
-设置链接地址


<img>
-插入图片


android:autolink属性(tv2)

None-不匹配任何链接(默认)

web-网址

email-邮箱

phone-电话

map-匹配映射地址

all-匹配所有链接

TextView还可以显示表情图像与文本(tv3)、点击图像4可跳转链接(www.baidu.com)

TextView实现文字链接跳转Activity(tv4)

利用TextView的一些属性:
android:ellipsize="start"省略号在开头
android:ellipsize="middle"省略号在中间
android:ellipsize="end"省略号在结尾
android:ellipsize="marquee"跑马灯显示
外加一个android:focusable="true"android:focusableModel


但是存在Bug,一旦失去焦点则无法继续滚动了

可以尝试重写TextView,isFocuse()方法,returntrue;可以解决一般失去焦点的问题。

但是该种方式在ReBornForTextViewHTML项目中运行后并没有这样的效果,初步认为是无法获取到焦点,如果需要实现,使用重写TextView的方法会更好,本项目里面重写的TextView点击可暂停,再次点击可继续滚动。

android:ellipsize实现跑马灯效果总结

AndroidStudio项目实战-ReBornForTextViewHTML

主要代码:

MainActivity:
privatevoidinitView(){
tv1=(TextView)findViewById(R.id.tv1);//使用HTML
tv2=(TextView)findViewById(R.id.tv2);//使用autoLink属性
tv3=(TextView)findViewById(R.id.tv3);//使用HTML+反射机制获取资源id
tv4=(MarqueeTextView)findViewById(R.id.tv4);//使用3个属性实现跑马灯效果
//tv1
StringstrTv1HTML="<fontcolor='red'>RebornForTextViewHTML</font><br>";
strTv1HTML+="<fontcolor='#0000ff'><big><i>Iloveandroid</i></big></font><p>";
strTv1HTML+="<big><ahref='http://www.baidu.com'>百度</a><big>";
CharSequencecharSequence=Html.fromHtml(strTv1HTML);
tv1.setText(charSequence);
tv1.setMovementMethod(LinkMovementMethod.getInstance());//点击时候产生超链接
//tv2
StringstrTv2="我的URL:
'target='_blank'>http://www.sina.com\n";
strTv2+="我的email:532612578@qq.com\n";
strTv2+="我的电话:+86010-2131233";
tv2.setText(strTv2);
tv2.setMovementMethod(LinkMovementMethod.getInstance());
//tv3
tv3.setTextColor(Color.BLACK);
StringstrTv3HTML="图像1<imgsrc='image1'/>图像2<imgsrc='image2'/>图像3<imgsrc='image3'/>";
strTv3HTML+="图像4<ahref='http://www.baidu.com'><imgsrc='image4'></a>图像5<imgsrc='image5'/>";
//底部有该方法源码
CharSequencechtv3=Html.fromHtml(strTv3HTML,newHtml.ImageGetter(){
@Override
publicDrawablegetDrawable(Stringsource){
//获得系统资源信息
Drawabledrawable=getResources().getDrawable(getResourceId(source));
//将第三张图片按比例压缩成原宽高的50%
if(source.equals("image3")){
drawable.setBounds(0,0,drawable.getIntrinsicWidth()/2,drawable.getIntrinsicHeight()/2);
}else{//按比例压缩成原宽高的25%
drawable.setBounds(0,0,drawable.getIntrinsicWidth()/4,drawable.getIntrinsicHeight()/4);
}
returndrawable;
}
},null);
tv3.setText(chtv3);
tv3.setMovementMethod(LinkMovementMethod.getInstance());
StringstrTv4="《档案》是北京电视台推出的纪实栏目,于2009年2月4日开播。节目定位为演播室节目,由一个特定的,极具个性化的讲述者(主持人)现场讲述和展示为基本形态,节目形式以案件和事";
CharSequencecharSequence4=Html.fromHtml(strTv4);
tv4.setText(charSequence4);
tv4.setMovementMethod(LinkMovementMethod.getInstance());
tv4.init(getWindowManager());
tv4.startScroll();
}


```getResourceId方法:
/**
*根据name获取资源id
*
*@paramname
*@return
*/
publicintgetResourceId(Stringname){
//根据资源ID变量名获得Field对象,使用反射机制
try{
Fieldfield=R.drawable.class.getField(name);
//取得并返回资源id字段(静态变量)的值
returnInteger.parseInt(field.get(null).toString());
}catch(Exceptione){
e.printStackTrace();
}
return0;
}


```MarqueeTextView:
publicclassMarqueeTextViewextendsTextViewimplementsView.OnClickListener{
publicfinalstaticStringTAG=MarqueeTextView.class.getSimpleName();
privatefloattextLength=0f;//文本长度
privatefloatviewWidth=0f;
privatefloatstep=0f;//文字的横坐标
privatefloaty=0f;//文字的纵坐标
privatefloattemp_view_plus_text_length=0.0f;//用于计算的临时变量
privatefloattemp_view_plus_two_text_length=0.0f;//用于计算的临时变量
publicbooleanisStarting=false;//是否开始滚动
privatePaintpaint=null;//绘图样式
privateStringtext="";//文本内容
publicMarqueeTextView(Contextcontext){
super(context);
initView();
}
publicMarqueeTextView(Contextcontext,AttributeSetattrs){
super(context,attrs);
initView();
}
publicMarqueeTextView(Contextcontext,AttributeSetattrs,intdefStyle){
super(context,attrs,defStyle);
initView();
}
privatevoidinitView(){
setOnClickListener(this);
}
publicvoidinit(WindowManagerwindowManager){
paint=getPaint();
text=getText().toString();
textLength=paint.measureText(text);
viewWidth=getWidth();
if(viewWidth==0){
if(windowManager!=null){
Displaydisplay=windowManager.getDefaultDisplay();
viewWidth=display.getWidth();
}
}
step=textLength;
temp_view_plus_text_length=viewWidth+textLength;
temp_view_plus_two_text_length=viewWidth+textLength*2;
y=getTextSize()+getPaddingTop();
}
@Override
publicParcelableonSaveInstanceState(){
ParcelablesuperState=super.onSaveInstanceState();
SavedStatess=newSavedState(superState);
ss.step=step;
ss.isStarting=isStarting;
returnss;
}
@Override
publicvoidonRestoreInstanceState(Parcelablestate){
if(!(stateinstanceofSavedState)){
super.onRestoreInstanceState(state);
return;
}
SavedStatess=(SavedState)state;
super.onRestoreInstanceState(ss.getSuperState());
step=ss.step;
isStarting=ss.isStarting;
}
publicstaticclassSavedStateextendsBaseSavedState{
publicbooleanisStarting=false;
publicfloatstep=0.0f;
SavedState(ParcelablesuperState){
super(superState);
}
@Override
publicvoidwriteToParcel(Parcelout,intflags){
super.writeToParcel(out,flags);
out.writeBooleanArray(newboolean[]{isStarting});
out.writeFloat(step);
}
publicstaticfinalParcelable.Creator<SavedState>CREATOR
=newParcelable.Creator<SavedState>(){
publicSavedState[]newArray(intsize){
returnnewSavedState[size];
}
@Override
publicSavedStatecreateFromParcel(Parcelin){
returnnewSavedState(in);
}
};
privateSavedState(Parcelin){
super(in);
boolean[]b=null;
in.readBooleanArray(b);
if(b!=null&&b.length>0)
isStarting=b[0];
step=in.readFloat();
}
}
publicvoidstartScroll(){
isStarting=true;
invalidate();
}
publicvoidstopScroll(){
isStarting=false;
invalidate();
}
@Override
publicvoidonDraw(Canvascanvas){
canvas.drawText(text,temp_view_plus_text_length-step,y,paint);
if(!isStarting){
return;
}
step+=0.5;//0.5为文字滚动速度。
if(step>temp_view_plus_two_text_length)
step=textLength;
invalidate();
}
@Override
publicvoidonClick(Viewv){
if(isStarting)
stopScroll();
else
startScroll();
}
}


布局文件:
<TextView
android:id="@+id/tv2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/tv1"
android:autoLink="all"
android:text="@string/link_text"
android:textSize="12sp"/>
<TextView
android:id="@+id/tv3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/tv2"
android:background="#FFF"
android:text="tv3-img+HTML"
android:textSize="12sp"/>
<com.rdc.rebornfortextviewhtml.view.MarqueeTextView
android:id="@+id/tv4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/tv3"
android:background="#FFF"
android:textColor="@android:color/black"
/>




最后附上fromHtml方法源码解析:

fromHtml(Stringsource,ImageGetterimageGetter,TagHandlertagHandler)方法源码解析

/**

ReturnsdisplayablestyledtextfromtheprovidedHTMLstring.
Any<img>tagsintheHTMLwillusethespecifiedImageGetter
torequestarepresentationoftheimage(usenullifyoudon’t
wantthis)andthespecifiedTagHandlertohandleunknowntags
(specifynullifyoudon’twantthis).

ThisusesTagSouptohandlerealHTML,includingallofthebrokennessfoundinthewild.

*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: