android TextView描边
前言
上一篇已经讲了如何实现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描边的更多相关文章
- Android TextView 添加下划线的几种方式
总结起来大概有5种做法: 1. 将要处理的文字写到一个资源文件,如string.xml(使用html用法格式化) 2. 当文字中出现URL.E-mail.电话号码等的时候,可以将TextView ...
- Android TextView图文混合编排
Android TextView图文混合编排 实现技术细节不难,两个要点:1.html代码的混合编写.2,重写ImageGetter.例如:布局: <?xml version="1.0 ...
- Android:TextView 自动滚动(跑马灯) (转)
Android:TextView 自动滚动(跑马灯) TextView实现文字滚动需要以下几个要点: 1.文字长度长于可显示范围:android:singleLine="true ...
- android Textview动态设置大小
import android.app.Activity; //import com.travelzen.tdx.BaseActivity; //import com.travelzen.tdx.uti ...
- Android TextView内容过长加省略号,点击显示全部内容
在Android TextView中有个内容过长加省略号的属性,即ellipsize,用法如下: 在xml中:android:ellipsize="end" 省略号在结尾an ...
- android TextView多行文本(超过3行)使用ellipsize属性无效问题的解决方法
这篇文章介绍了android TextView多行文本(超过3行)使用ellipsize属性无效问题的解决方法,有需要的朋友可以参考一下 布局文件中的TextView属性 复制代码代码如下: < ...
- Android - TextView Ellipsize属性
Android - TextView Ellipsize属性 本文地址: http://blog.csdn.net/caroline_wendy android:ellipsize属性: If set ...
- Android TextView中有图片有文字混合排列
Android TextView中有图片有文字混合排列 1.使用html.fromHtml 2.新建ImageGetter 3.使用<img src>标签 demo: 1.设置文字 ((T ...
- Android TextView背景颜色与背景图片设置
Android TextView 背景颜色与背景图片设置,android textview 控件,android textview 背景, android textview 图片,android te ...
随机推荐
- go/wiki/MutexOrChannel Golang并发:选channel还是选锁?
https://mp.weixin.qq.com/s/JcED2qgJEj8LaBckVZBhDA https://github.com/golang/go/wiki/MutexOrChannel M ...
- [Day20]Map接口、可变参数、Collections
1.Map接口-元素成对存在,每个元素由健与值两部分组成,通过键可以找所对应的值 1.1 Map子类 (1)HashMap<K,V>:存储数据所用的哈希表结构,元素的存取数据顺序不能保证一 ...
- flutter 学习零碎知识点01
1.Expanded组件 占满可用空间 -----可以到达类似flex布局中 第一列占用大量空间,所以它必须包装在Expanded widget中. 写死的高度改成Expanded自动撑满屏幕如果还 ...
- Elasticsearch学习笔记(七)document小结
一.生成document id 1.自动生成document id 自动生成的id,长度为20个字符,URL安全,base64编码,GUID,分布式系统并行生成时不可能 ...
- 数电基础之《OC门》
OC门,又称集电极开路门,Open Collector. 为什么引入OC门?实际使用中,有时需要两个或两个以上与非门的输出端连接在同一条导线上,将这些与非门上的数据(状态电平)用同一条导线输送出去 ...
- 零python基础--爬虫实践总结
网络爬虫,是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本. 爬虫主要应对的问题:1.http请求 2.解析html源码 3.应对反爬机制. 觉得爬虫挺有意思的,恰好看到知乎有人分享的一个爬虫 ...
- 动态代理处理service
/* 动态代理处理service * 1.动态代理的核心是切面编程,去除重复代码: * 2.通过反射+注解可以灵活的获取传入对象内容: * 3.通过try+catch将多个操作包裹,实现事物的原子性: ...
- BIML 101 - ETL数据清洗 系列 - BIML 快速入门教程 - 序
BIML 101 - BIML 快速入门教程 做大数据的项目,最花时间的就是数据清洗. 没有一个相对可靠的数据,数据分析就是无木之舟,无水之源. 如果你已经进了ETL这个坑,而且预算有限,并且有大量的 ...
- js中hash、hashchange事件
1.hash即URL中"#"字符后面的部分. ①使用浏览器访问网页时,如果网页URL中带有hash,页面就会定位到id(或name)与hash值一样的元素的位置: ②hash还有另 ...
- MyBatis基本使用
MyBatis是轻量级的数据库访问API,封装了JDBC操作,可以实现对实体对象的CRUD操作. MyBatis体系结构主要组成部分: 配置文件:SqlMapConfig.xml 主配置文件 ...