Android为TextView添加字体库和设置描边的方法
一、使用系统自带的字体
开发android的人大多都知道,android里面对字体的支持少得可怜,默认情况下,textview 的 typeface 属性支持 sans、serif和monospace 这三种字体,如果在没有指定字体的情况下,系统会使用 sans 作为文本显示的字体。但这三种字体只支持英文,也就是说只要你显示的文字是中文,无论你选择这三种字体中的哪一种,显示效果都是一样的。
1.在xml文件中设置
<!-- 使用默认的sans字体--> <textview android:id="@+id/sans" android:text="hello,world" android:textsize="20sp" android:typeface="sans" /> <!-- 使用默认的serifs字体--> <textview android:id="@+id/serif" android:text="hello,world" android:textsize="20sp" android:typeface="serif" /> <!-- 使用默认的monospace字体--> <textview android:id="@+id/monospace" android:text="hello,world" android:textsize="20sp" android:typeface="monospace" />
2.在java代码中设置
第一步: 获取textview实例
//获取textview实例 textview textview = findviewbyid(r.id.textview);
第二步:设置字体
//设置serif字体 textview.settypeface(typeface.serif); //设置sans字体 textview.settypeface(typeface.sans_serif); //设置monospace字体 textview.settypeface(typeface.monospace);
二、为textview添加字体库
android系统自带有对字体的设置,这些设置是对字体的显示方式的设置,比如加粗、倾斜、下划线、字号等,但是并没有提供对于字体类型的徐选择,比如设置成楷体、隶书或雅黑等。android系统只固定默认一种字体类型,所以如果开发人员需要修改字体类型,那么就必须需自己引入字体库。
1.引入字体库的实现
第一步:在assets目录下新建fonts目录,并把ttf字体文件放到该目录下。
第二步:在java代码中实现
//实例化textview textview textview = findviewbyid(r.id.textview); //得到assetmanager assetmanager mgr=getassets(); //根据路径得到typeface typeface tf=typeface.createfromasset(mgr, "fonts/pocknum.ttf"); //设置字体 textview.settypeface(tf);
2.引入字体库后的效果图
三、为textview添加描边
android的默认控件textview,相信大家都不会陌生,但是原生的textview是不支持描边效果的,但是在实际的开发过程中,经常会遇到为textview添加描边的需求,因此就要对原生的textview进行拓展,使其支持自定义内部和外部颜色的描边textview。描边效果的实现原理其实很简单,无非就是获取到textpaint类,先进行一次比默认大小的文字内容稍微大一点的绘制,然后再进行一次默认大小的文字内容的绘制,然后通过属性设置两种不同的颜色,这样就产生出了描边效果。
为textview添加描边,要用到textpaint的几个属性:
textpaint paint = outlinetextview.getpaint(); //实例化textpaint对象 paint.setstrokewidth(15); //设置描边的宽度 paint.setstyle(paint.style.stroke);//设置画笔属性为描边 stroketextview.settextcolor(color.parsecolor(“#000000”)); //设置描边的颜色(不能与文本颜色一致)
其中stroketextview为自定义textview的实例,代码如下:
1.在构造函数中添加
public class stroketextview extends textview { private textview outlinetextview = null; public stroketextview(context context) { super(context); outlinetextview = new textview(context); init(); } public stroketextview(context context, attributeset attrs) { super(context, attrs); outlinetextview = new textview(context, attrs); init(); } public stroketextview(context context, attributeset attrs, int defstyle) { super(context, attrs, defstyle); outlinetextview = new textview(context, attrs, defstyle); init(); } public void init() { textpaint paint = outlinetextview.getpaint(); paint.setstrokewidth(3); //描边宽度 paint.setstyle(style.stroke); outlinetextview.settextcolor(color.parsecolor("#000000")); //描边颜色 outlinetextview.setgravity(getgravity()); } @override public void setlayoutparams (viewgroup.layoutparams params) { super.setlayoutparams(params); outlinetextview.setlayoutparams(params); } @override protected void onmeasure(int widthmeasurespec, int heightmeasurespec) { super.onmeasure(widthmeasurespec, heightmeasurespec); //设置轮廓文字 charsequence outlinetext = outlinetextview.gettext(); if (outlinetext == null || !outlinetext.equals(this.gettext())) { outlinetextview.settext(gettext()); postinvalidate(); } outlinetextview.measure(widthmeasurespec, heightmeasurespec); } @override protected void onlayout (boolean changed, int left, int top, int right, int bottom) { super.onlayout(changed, left, top, right, bottom); outlinetextview.layout(left, top, right, bottom); } @override protected void ondraw(canvas canvas) { outlinetextview.draw(canvas); super.ondraw(canvas); } }
2.重写ondraw方法
public class stroketextview extends textview { private textview outlinetextview = null; private textpaint strokepaint; public stroketextview(context context) { super(context); outlinetextview = new textview(context); } public stroketextview(context context, attributeset attrs) { super(context, attrs); outlinetextview = new textview(context, attrs); } public stroketextview(context context, attributeset attrs, int defstyle) { super(context, attrs, defstyle); outlinetextview = new textview(context, attrs, defstyle); } @override public void setlayoutparams (viewgroup.layoutparams params) { super.setlayoutparams(params); outlinetextview.setlayoutparams(params); } @override protected void onmeasure(int widthmeasurespec, int heightmeasurespec) { super.onmeasure(widthmeasurespec, heightmeasurespec); assetmanager manager = context.getassets(); string path = "fonts/new_text.ttf"; typeface type = typeface.createfromasset(manager, path); //设置轮廓文字 charsequence outlinetext = outlinetextview.gettext(); if (outlinetext == null || !outlinetext.equals(this.gettext())) { outlinetextview.settext(gettext()); outlinetextview.settypeface(type); settypeface(type); postinvalidate(); } outlinetextview.measure(widthmeasurespec, heightmeasurespec); } @override protected void onlayout (boolean changed, int left, int top, int right, int bottom) { super.onlayout(changed, left, top, right, bottom); outlinetextview.layout(left, top, right, bottom); } @override protected void ondraw(canvas canvas) { assetmanager manager = context.getassets(); string path = "fonts/new_text.ttf"; typeface type = typeface.createfromasset(manager, path); if (strokepaint == null) { strokepaint = new textpaint(); } //复制原来textviewg画笔中的一些参数 textpaint paint = getpaint(); strokepaint.settextsize(paint.gettextsize()); strokepaint.settypeface(type); strokepaint.setflags(paint.getflags()); strokepaint.setalpha(paint.getalpha()); //自定义描边效果 strokepaint.setstyle(paint.style.stroke); strokepaint.setcolor(color.parsecolor("#000000")); strokepaint.setstrokewidth(4); string text = gettext().tostring(); //在文本底层画出带描边的文本 canvas.drawtext(text, (getwidth() - strokepaint.measuretext(text)) / 2, getbaseline(), strokepaint); super.ondraw(canvas); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。