前言

上一篇已经讲了如何实现textView中粗字体效果,里面主要重写了onDraw方法。

这一边讲一个进阶功能,实现textView的描边效果。

上效果图。

上代码:

public class StrokeTextView extends TextView {

    private TextView backGroundText = null;//用于描边的TextView

    public StrokeTextView(Context context) {
this(context, null);
} public StrokeTextView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
} public StrokeTextView(Context context, AttributeSet attrs,
int defStyle) {
super(context, attrs, defStyle);
backGroundText = new TextView(context, attrs, defStyle);
} @Override
public void setLayoutParams(ViewGroup.LayoutParams params) {
//同步布局参数
backGroundText.setLayoutParams(params);
super.setLayoutParams(params);
} @Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
CharSequence tt = backGroundText.getText();
//两个TextView上的文字必须一致
if (tt == null || !tt.equals(this.getText())) {
backGroundText.setText(getText());
this.postInvalidate();
}
backGroundText.measure(widthMeasureSpec, heightMeasureSpec);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
} protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
backGroundText.layout(left, top, right, bottom);
super.onLayout(changed, left, top, right, bottom);
} @Override
protected void onDraw(Canvas canvas) {
//其他地方,backGroundText和super的先后顺序影响不会很大,但是此处必须要先绘制backGroundText,
init();
backGroundText.draw(canvas);
super.onDraw(canvas);
} public void init() {
TextPaint tp1 = backGroundText.getPaint();
//设置描边宽度
tp1.setStrokeWidth(2);
//背景描边并填充全部
tp1.setStyle(Paint.Style.FILL_AND_STROKE);
//设置描边颜色
backGroundText.setTextColor(Color.parseColor("#1E90FF"));
//将背景的文字对齐方式做同步
backGroundText.setGravity(getGravity());
} }

原理讲解:

效果实现思路是:因为系统api只给paint设置strokewidth方法,却没有提供设置描边的色值的方法,而且我们通过上一篇博客知道,设置描边属性的textview,会比没有设置描边属性的textview粗一点

所以我们可以通过自定义两个Textview,其中一个有描边的作为背景TextView,另外一个没有描边的细一点的textview作为内容。这样两个textview合并在一起,就给人一种有描边的感觉。

知识点讲解:

1、对于需要修改、或者需要封装自定义控件的小伙伴,可以只针对init进行修改。在里面设置strokewidth宽度,还有textColor就可以了。

2、如果在init方法中,paint的style设置为stroke属性,则可以这样写

    @Override
protected void onDraw(Canvas canvas) {
//其他地方,backGroundText和super的先后顺序影响不会很大,但是此处必须要先绘制backGroundText,
super.onDraw(canvas);
init();
backGroundText.draw(canvas);
}

当设置paint的style属性为stroke时,两种写法的区别是,第二种写法效果的描边更粗一点。

拓展:文字发光效果

private TextView txt_name;

txt_name.setShadowLayer(12,0,0, Color.WHITE);

– 参数详解 –
setShadowLayer(float radius, float dx, float dy, int color)
1.radius:模糊半径,越大越模糊
2.dx:x轴偏移量,阴影离开文字的x横向距离
3.dy:y轴偏移量,阴影离开文字的Y横向距离
4.color:阴影颜色

android TextView描边的更多相关文章

  1. Android TextView 添加下划线的几种方式

    总结起来大概有5种做法:  1. 将要处理的文字写到一个资源文件,如string.xml(使用html用法格式化)   2. 当文字中出现URL.E-mail.电话号码等的时候,可以将TextView ...

  2. Android TextView图文混合编排

    Android TextView图文混合编排 实现技术细节不难,两个要点:1.html代码的混合编写.2,重写ImageGetter.例如:布局: <?xml version="1.0 ...

  3. Android:TextView 自动滚动(跑马灯) (转)

    Android:TextView 自动滚动(跑马灯)       TextView实现文字滚动需要以下几个要点: 1.文字长度长于可显示范围:android:singleLine="true ...

  4. android Textview动态设置大小

    import android.app.Activity; //import com.travelzen.tdx.BaseActivity; //import com.travelzen.tdx.uti ...

  5. Android TextView内容过长加省略号,点击显示全部内容

    在Android TextView中有个内容过长加省略号的属性,即ellipsize,用法如下: 在xml中:android:ellipsize="end"    省略号在结尾an ...

  6. android TextView多行文本(超过3行)使用ellipsize属性无效问题的解决方法

    这篇文章介绍了android TextView多行文本(超过3行)使用ellipsize属性无效问题的解决方法,有需要的朋友可以参考一下 布局文件中的TextView属性 复制代码代码如下: < ...

  7. Android - TextView Ellipsize属性

    Android - TextView Ellipsize属性 本文地址: http://blog.csdn.net/caroline_wendy android:ellipsize属性: If set ...

  8. Android TextView中有图片有文字混合排列

    Android TextView中有图片有文字混合排列 1.使用html.fromHtml 2.新建ImageGetter 3.使用<img src>标签 demo: 1.设置文字 ((T ...

  9. Android TextView背景颜色与背景图片设置

    Android TextView 背景颜色与背景图片设置,android textview 控件,android textview 背景, android textview 图片,android te ...

随机推荐

  1. ip通信第七周

    局域网的优点:1.具有较高的数据传输率 2.具有较低的误码率 3.具有较低的时延 4.能进行广播 网桥的基本特征:1.网桥在数据链录层上实现局域网互连 2.网桥能够互连两个采用不同数据链路层协议,不同 ...

  2. datetime 计算时间差

    计算时间差: .date()       # 格式化 .timedelta()         # 时间差 import datetime # 今天 today = datetime.datetime ...

  3. Java注解之 @Target、@Retention简介

    先来看一个Spring中的一个常用注解 package org.springframework.stereotype; import java.lang.annotation.Documented; ...

  4. abap 变量检查

    1:sap logon中可以对变量命名进行检查 program>check>code inspector

  5. 【Linux】-NO.160.Linux.1 -【升级Centos7】

    Style:Mac Series:Java Since:2018-09-10 End:2018-09-10 Total Hours:1 Degree Of Diffculty:5 Degree Of ...

  6. 爬取豆瓣电影排行top250

    功能描述V1.0: 爬取豆瓣电影排行top250 功能分析: 使用的库 1.time 2.json 3.requests 4.BuautifulSoup 5.RequestException 上机实验 ...

  7. vue中动态样式不起作用? scoped了解一下

    vue中style标签使用属性scoped的注意事项 style上添加属性scoped可以实现样式私有化,但是在使用动态样式时,样式会不起作用.可以先去掉scoped

  8. OI养老专题02:约瑟夫问题求幸存者

    如题.人数为n(1<=n<=30000),共k(1<=k<=30000)组数据,所报的数m恒为2,只要求输出幸存者. 如果你还不知道什么是约瑟夫问题...——https://w ...

  9. 用php实现斐波那契数列,如: 1, 1, 2, 3, 5, 8, 13, 21, 34。求出第20个数的值。

    <?php function Fibonacci($n){ if ($n <= 0) { return 0; } elseif ($n == 1) { return 1; } else { ...

  10. PHP yii框架FormWidget组件

    本篇文章介绍的是PHP yii框架Form组件,方便在view层更好调用此功能,话不多说上代码:1.先继承yii本身Widget类 <?php/** * User: lsh */ namespa ...