Android 带边框的自定义TextView
图片效果如下:
参考代码:
package com.tuniu.hotel.customview;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.widget.TextView;
import com.tuniu.app.utils.ExtendUtil;
import com.tuniu.hotel.commonUtils.ExtendUtils;
/**
* 带边框的TextView
*/
public class BorderTextView extends TextView {
public static final float DEFAULT_STROKE_WIDTH = 0.5f; // 默认边框宽度
public static final float DEFAULT_CORNER_RADIUS = 2.0f; // 默认圆角半径, 2dp
public static final float DEFAULT_LR_PADDING = 3f; // 默认左右内边距
public static final float DEFAULT_TB_PADDING = 2f; // 默认上下内边距
private int strokeWidth; // 边框线宽
private int strokeColor; // 边框颜色
private int cornerRadius; // 圆角半径
private Paint mPaint = new Paint(); // 画边框所使用画笔对象
private RectF mRectF; // 画边框要使用的矩形
public BorderTextView(Context context) {
this(context, null);
}
public BorderTextView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public BorderTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
mRectF = new RectF();
cornerRadius = ExtendUtils.dip2px(getContext(), DEFAULT_CORNER_RADIUS);
strokeWidth = ExtendUtil.dip2px(getContext(), DEFAULT_STROKE_WIDTH);
int paddingLR = ExtendUtils.dip2px(getContext(), DEFAULT_LR_PADDING);
int paddingTB = ExtendUtils.dip2px(getContext(), DEFAULT_TB_PADDING);
setPadding(paddingLR, paddingTB, paddingLR, paddingTB);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
mPaint.setStyle(Paint.Style.STROKE); // 空心效果
mPaint.setAntiAlias(true); // 设置画笔为无锯齿
mPaint.setStrokeWidth(strokeWidth); // 线宽
mPaint.setColor(strokeColor);
// 画空心圆角矩形
mRectF.left = mRectF.top = 0.5f * strokeWidth;
mRectF.right = getMeasuredWidth() - strokeWidth;
mRectF.bottom = getMeasuredHeight() - strokeWidth;
canvas.drawRoundRect(mRectF, cornerRadius, cornerRadius, mPaint);
}
public void setBorderCorlor(int corlor) {
strokeColor = corlor;
setTextColor(strokeColor);
}
}