Search code examples
androidtextview

How to make border for text in TextView?


I want make border for my text in TextView. I try find solution for me, but I find only shadow - it's look like:

enter image description here

But I want like this:

enter image description here

How can I make border for text?


Solution

  • public class CoustomTextView extends TextView {
    
        private float strokeWidth;
        private Integer strokeColor;
        private Paint.Join strokeJoin;
        private float strokeMiter;
    
    
        public CoustomTextView(Context context) {
            super(context);
            init(null);
        }
    
        public CoustomTextView(Context context, AttributeSet attrs) {
            super(context, attrs);
            init(attrs);
        }
    
        public CoustomTextView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            init(attrs);
        }
    
        public void init(AttributeSet attrs) {
    
            if (attrs != null) {
                TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.CoustomTextView);
    
                if (a.hasValue(R.styleable.CoustomTextView_strokeColor)) {
                    float strokeWidth = a.getDimensionPixelSize(R.styleable.CoustomTextView_strokeWidth, 1);
                    int strokeColor = a.getColor(R.styleable.CoustomTextView_strokeColor, 0xff000000);
                    float strokeMiter = a.getDimensionPixelSize(R.styleable.CoustomTextView_strokeMiter, 10);
                    Paint.Join strokeJoin = null;
                    switch (a.getInt(R.styleable.CoustomTextView_strokeJoinStyle, 0)) {
                        case (0):
                            strokeJoin = Paint.Join.MITER;
                            break;
                        case (1):
                            strokeJoin = Paint.Join.BEVEL;
                            break;
                        case (2):
                            strokeJoin = Paint.Join.ROUND;
                            break;
                    }
                    this.setStroke(strokeWidth, strokeColor, strokeJoin, strokeMiter);
                }
            }
        }
    
        public void setStroke(float width, int color, Paint.Join join, float miter) {
            strokeWidth = width;
            strokeColor = color;
            strokeJoin = join;
            strokeMiter = miter;
        }
    
        @Override
        public void onDraw(Canvas canvas) {
            super.onDraw(canvas);
    
            int restoreColor = this.getCurrentTextColor();
            if (strokeColor != null) {
                TextPaint paint = this.getPaint();
                paint.setStyle(Paint.Style.STROKE);
                paint.setStrokeJoin(strokeJoin);
                paint.setStrokeMiter(strokeMiter);
                this.setTextColor(strokeColor);
                paint.setStrokeWidth(strokeWidth);
                super.onDraw(canvas);
                paint.setStyle(Paint.Style.FILL);
                this.setTextColor(restoreColor);
            }
        }
    }
    

    Usage:

    public class MainActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            CoustomTextView coustomTextView = (CoustomTextView) findViewById(R.id.pager_title);
        }
    }
    

    Layout:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="@mipmap/background">
    
    
        <pk.sohail.gallerytest.activity.CoustomTextView
            android:id="@+id/pager_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true"
            android:gravity="center"
            android:text="@string/txt_title_photo_gallery"
            android:textColor="@color/white"
            android:textSize="30dp"
            android:textStyle="bold"
            app:outerShadowRadius="10dp"
            app:strokeColor="@color/title_text_color"
            app:strokeJoinStyle="miter"
            app:strokeWidth="2dp" />
    
    </RelativeLayout>
    

    attars:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
    
        <declare-styleable name="CoustomTextView">
    
            <attr name="outerShadowRadius" format="dimension" />
            <attr name="strokeWidth" format="dimension" />
            <attr name="strokeMiter" format="dimension" />
            <attr name="strokeColor" format="color" />
            <attr name="strokeJoinStyle">
                <enum name="miter" value="0" />
                <enum name="bevel" value="1" />
                <enum name="round" value="2" />
            </attr>
        </declare-styleable>
    
    </resources>
    

    Programmatically:

    CoustomTextView mtxt_name = (CoustomTextView) findViewById(R.id.pager_title);
    

    Use setStroke(); method before calling setText();