论TextView的超链接使用、显示表情、Html语法支持、跑马灯效果的实现
2016-03-12 17:41
651 查看
传送门:在Android實作HTML
TextView與AutoLink使用的建議方式
Android的TextView除了可以显示文字,还可以使用HTML语法来调整文字样式,无需特地使用WebView。
小白普及:另外,需要学习HTML语言(tv1)
android:autolink属性(tv2)
None-不匹配任何链接(默认)
web-网址
email-邮箱
phone-电话
map-匹配映射地址
all-匹配所有链接
TextView还可以显示表情图像与文本(tv3)、点击图像4可跳转链接(www.baidu.com)
TextView实现文字链接跳转Activity(tv4)
利用TextView的一些属性:
但是存在Bug,一旦失去焦点则无法继续滚动了
可以尝试重写TextView,isFocuse()方法,returntrue;可以解决一般失去焦点的问题。
但是该种方式在ReBornForTextViewHTML项目中运行后并没有这样的效果,初步认为是无法获取到焦点,如果需要实现,使用重写TextView的方法会更好,本项目里面重写的TextView点击可暂停,再次点击可继续滚动。
android:ellipsize实现跑马灯效果总结
AndroidStudio项目实战-ReBornForTextViewHTML
主要代码:
MainActivity:
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点击可暂停,再次点击可继续滚动。
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());//tv3tv3.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();elsestartScroll();}}
布局文件:<TextViewandroid: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"/><TextViewandroid: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.MarqueeTextViewandroid: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.
*/
相关文章推荐
- Submime Text2 安装
- Submime Text2 安装
- HTML页面特殊字符代码
- #001 HTML快速入门讲解
- day13—HTML DOM编程
- HTML基础篇--初识HTML
- 第 8 章 DOM 对象,控制 HTML 元素
- 如何为html代码加密
- HTML标签大全(很全哦).
- HTML学习笔记(一)
- html代码书写规范
- HTML超连接
- HTML-网页常见错误
- .html文件转换成.txt
- HTML里link meta全部标签的作用
- html页面中点击链接自动跳出相应用户的QQ聊天窗口的做法
- 使用OSWatcher收集系统信息并生成html
- Odoo8.0安装wkhtmltopdf报表运行环境
- html关于mailto用法详解
- 生成丶清除指定目录下的HTML文件