package com.test.views;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Rect;
import android.graphics.RectF;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.View;
import androidx.annotation.Nullable;
import com.test.R;
/**
* 圆角矩形文本框
*/
public class RoundedRectangleTextView extends View {
private Paint mPaintText;
private Paint mPaintBg;
//竖直方向的值
private float strokeWidth = 10; //框的粗细
private float textDividerStrokeW = 20; //文字和框的水平的间隔
private float textHeight = 20; //文字高度
//水平方向的值
private float textDividerStrokeH = 20; //文字和框水平的间隔
private float textWidth = 40; //文字宽度
private boolean isSelected = false; //是否选中
private String mText = "";
public RoundedRectangleTextView(Context context) {
this(context, null);
}
public RoundedRectangleTextView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public RoundedRectangleTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
mPaintText = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaintBg = new Paint(Paint.ANTI_ALIAS_FLAG);
}
public void setText(String text) {
if (TextUtils.isEmpty(text)) {
mText = "";
} else {
mText = text;
}
invalidate();
}
public void setSelected(boolean isSelected) {
this.isSelected = isSelected;
invalidate();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
//这里要先把文字宽高算出来再去度量整个宽高
mPaintText.setTextSize(60);
mPaintText.setFakeBoldText(true);
Rect rect = new Rect();
mPaintText.getTextBounds(mText, 0, mText.length(), rect);
textHeight = rect.height();
textWidth = rect.width();
int width = MeasureSpec.getSize(widthMeasureSpec);
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int height = MeasureSpec.getSize(heightMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int wrapWidth = (int) (textWidth + 2 * textDividerStrokeW + 2 * strokeWidth);
int wrapHeight = (int) (textHeight + 2 * textDividerStrokeH + 2 * strokeWidth);
if (widthMode == MeasureSpec.AT_MOST && heightMode == MeasureSpec.AT_MOST) {
setMeasuredDimension(wrapWidth, wrapHeight);
} else if (widthMode == MeasureSpec.AT_MOST) {
setMeasuredDimension(wrapWidth, height);
} else if (heightMode == MeasureSpec.AT_MOST) {
setMeasuredDimension(width, wrapHeight);
}
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
int width = getWidth();
int height = getHeight();
if (isSelected) {
//画背景
drawRec(canvas, mPaintBg, width, height);
}
//画中间的文字
drawText(canvas, mPaintText, width, height);
}
private void drawRec(Canvas canvas, Paint mPaint, int width, int height) {
mPaint.setColor(getResources().getColor(R.color.colorAccent));
mPaint.setStyle(Paint.Style.STROKE);//空心矩形框
mPaint.setStrokeWidth(10);
RectF rectF = new RectF(0 + strokeWidth / 2, 0 + strokeWidth / 2, width - strokeWidth / 2, height - strokeWidth / 2);
canvas.drawRoundRect(rectF, 60, 60, mPaint);
}
private void drawText(Canvas canvas, Paint paintCenter, int width, int height) {
Rect rect1 = new Rect();
paintCenter.getTextBounds(mText, 0, mText.length(), rect1);
int x = width / 2 - rect1.centerX();
int y = height / 2 - rect1.centerY();
canvas.drawText(mText, x, y, paintCenter);
}
}
好久没有自定义View了,复习复习~
最新推荐文章于 2024-04-22 07:00:58 发布