zoukankan      html  css  js  c++  java
  • 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:阴影颜色

  • 相关阅读:
    实战SQL Server 2005镜像配置全过程
    Sql Server 主从数据库配置
    Windows server2003 + sql server2005 集群配置安装
    windows配置nginx实现负载均衡集群
    Nginx 在windows下配合iis搭建负载均衡过程 [转]
    服务器后端开发系列——《实战Memcached内存缓存系统》
    一步一步配置NLB(续)之深入测试
    一步一步配置NLB
    Hadoop MapReduceV2(Yarn) 框架简介[转]
    亿级Web系统搭建——单机到分布式集群[转]
  • 原文地址:https://www.cnblogs.com/zxxiaoxia/p/10637965.html
Copyright © 2011-2022 走看看