美文网首页
Android 中TextView文字描边实现(二)

Android 中TextView文字描边实现(二)

作者: XiaoXred | 来源:发表于2020-10-22 19:48 被阅读0次

    Android 9.0效果图: 

    Android 10.0效果图: 


    1.StrokeTextView的实现

    package com.app.animalchess.widget;

    import android.content.Context;

    import android.graphics.Canvas;

    import android.graphics.Paint;

    import android.text.TextPaint;

    import android.util.AttributeSet;

    import android.view.ViewGroup;

    import android.widget.TextView;

    import androidx.appcompat.widget.AppCompatTextView;

    import com.app.animalchess.R;

    /**

    * @Author : XiaoXred

    * @Time : On 2020/10/22 15:59

    * @Description : StrokeTextView  文字内容有描边的TextView

    */

    public class StrokeTextViewextends AppCompatTextView {

    private TextViewbackGroundText =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(8);

            //背景描边并填充全部

            tp1.setStyle(Paint.Style.FILL_AND_STROKE);

            //设置描边颜色

            backGroundText.setTextColor(getResources().getColor(R.color.color_CC7B02));

            //将背景的文字对齐方式做同步

            backGroundText.setGravity(getGravity());

        }

    }

    2.xml文件

    <com.app.animalchess.widget.StrokeTextView

        android:layout_width="260dp"

        android:layout_height="50dp"

        android:text="登录"

        android:background="@drawable/login_btn_wchat_nor"

        android:textSize="18sp"

        android:gravity="center"

        android:layout_marginTop="140dp"

        android:layout_gravity="center"

        android:textColor="@color/color_ffffff"

        />

    相关文章

      网友评论

          本文标题:Android 中TextView文字描边实现(二)

          本文链接:https://www.haomeiwen.com/subject/tzppmktx.html