Android 自定义TextView实现描边

                                                   前言:

这里呢就是给自己的做的项目一些小功能做一个笔记。也希望能对大家能有帮助。

                                                   正文:

这里就简单的自定义了TextView 描边的效果。更多效果,

大家可以参照这个大神的:点击打开链接 以及这位大神:点击打开链接
还有这位小神 打开链接
我这里写的就不像上面两位大神功能那么强大了。
正题
描边效果的实现原理,是利用TextView在onDraw的时候,获取到画笔,先进行一次比默认大小的文字内容稍微大一点的绘制,然后再进行一次默认大小的文字内容的绘制,这样就产生出了描边效果,以下是具体的代码实现:

public class StrokeTextView extends android.support.v7.widget.AppCompatTextView {
 
    public TextView borderText;///用于描边的TextView
    private int colors;
 
    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);
        borderText = new TextView(context,attrs);
        init(attrs);
    }
 
    public void init(AttributeSet attrs){
 
        TypedArray ta = getContext().obtainStyledAttributes(attrs,R.styleable.StrokeTextView);
        colors = ta.getColor(R.styleable.StrokeTextView_stroke_color,0xFFFFFF);
        ta.recycle();
 
        TextPaint tp1 = borderText.getPaint();                //new
        tp1.setStrokeWidth(4);                                  //设置描边宽度
        tp1.setStyle(Style.STROKE);                             //对文字只描边
        borderText.setTextColor(colors);                        //设置描边颜色
        borderText.setGravity(getGravity());
    }
 
    @Override
    public void setLayoutParams (ViewGroup.LayoutParams params){
        super.setLayoutParams(params);
        borderText.setLayoutParams(params);
    }
 
    /**
     * onMeasure通过父View传递过来的大小和模式,
     * 以及自身的背景图片的大小得出自身最终的大小,
     * 然后通过setMeasuredDimension()方法设置给mMeasuredWidth和mMeasuredHeight.
     *
     * @param widthMeasureSpec
     * @param heightMeasureSpec
     */
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        CharSequence tt = borderText.getText();
         
        //两个TextView上的文字必须一致
        if(tt== null || !tt.equals(this.getText())){
            borderText.setText(getText());
            this.postInvalidate();
        }
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        borderText.measure(widthMeasureSpec, heightMeasureSpec);
    }
 
    /**
     * 该方法是View的放置方法,在View类实现。
     * 调用该方法需要传入放置View的矩形空间左上角left、top值和右下角right、bottom值。
     * 这四个值是相对于父控件而言的。
     *
     * @param changed
     * @param left
     * @param top
     * @param right
     * @param bottom
     */
    protected void onLayout (boolean changed, int left, int top, int right, int bottom){
        super.onLayout(changed, left, top, right, bottom);
        borderText.layout(left, top, right, bottom);
    }
 
    @Override
    protected void onDraw(Canvas canvas) {
        borderText.draw(canvas);
        super.onDraw(canvas);
    }
 
}


第二步:在Values资源文件中去定义自定义TextView 在xml布局中使用的属性
Android 自定义TextView实现描边_第1张图片



    
    
        
        
        
    

第三步:在xml布局中去使用自定义控件

注意:需要使用app:…自定义属性需要在根布局加上这句
xmlns:app=“http://schemas.android.com/apk/res-auto”
Android 自定义TextView实现描边_第2张图片
描边颜色app:stroke_color 字体颜色textColor
Android 自定义TextView实现描边_第3张图片
第四步:为了方便使用我在自定义文件中(StrokeTextView.java)
里面的 borderText 定义为了 public .这样就省了我再去定义一个方法
在这里插入图片描述
在代码中使用也是很方便的,使用Butterknife(黄油刀)去到到控件。
当然你也可以去findViewbyId去找到控件
在这里插入图片描述
接下来就直接使用就好了
找到控件后
这样使用就可以啦

就这样就好啦。好了到这里简单的自定义TextView描边就结束了

你可能感兴趣的:(Android 自定义TextView实现描边)