package com.llf.basemodel.commonwidget; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Path; import android.graphics.RectF; import android.graphics.drawable.GradientDrawable; import android.support.v7.widget.AppCompatTextView; import android.util.AttributeSet; import android.view.MotionEvent; import com.llf.basemodel.R; /** * Created by guof on 2016/8/3. */ public class ShapeTextView extends AppCompatTextView { public ShapeTextView(Context context) { super(context); } public ShapeTextView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(context, attrs); } /** * 实现自定义圆角背景 * 支持 * 1.四边圆角 * 2.指定边圆角 * 3.支持填充色以及边框色 * 4.支持按下效果 */ public ShapeTextView(Context context, AttributeSet attrs) { super(context, attrs); init(context, attrs); } //填充色 private int solidColor = 0; //边框色 private int strokeColor = 0; //按下填充色 private int solidTouchColor = 0; //按下边框色 private int strokeTouchColor = 0; //边框宽度 private int strokeWith = 0; private int shapeTpe = 0; //按下字体色 private int textTouchColor = 0; //字体色 private int textColor = 0; //圆角的半径 float radius = 0; float topLeftRadius = 0; float topRightRadius = 0; float bottomLeftRadius = 0; float bottomRightRadius = 0; public void init(Context context, AttributeSet attrs) { TypedArray ta = context.getTheme().obtainStyledAttributes(attrs, R.styleable.ShapeTextView, 0, 0); solidColor = ta.getInteger(R.styleable.ShapeTextView_solidColor, 0x00000000); strokeColor = ta.getInteger(R.styleable.ShapeTextView_strokeColor, 0x00000000); solidTouchColor = ta.getInteger(R.styleable.ShapeTextView_solidTouchColor, 0x00000000); strokeTouchColor = ta.getInteger(R.styleable.ShapeTextView_strokeTouchColor, 0x00000000); textTouchColor = ta.getInteger(R.styleable.ShapeTextView_textTouchColor, 0x00000000); textColor = getCurrentTextColor(); strokeWith = ta.getInteger(R.styleable.ShapeTextView_strokeWith, 0); radius = ta.getDimension(R.styleable.ShapeTextView_radius, 0); topLeftRadius = ta.getDimension(R.styleable.ShapeTextView_topLeftRadius, 0); topRightRadius = ta.getDimension(R.styleable.ShapeTextView_topRightRadius, 0); bottomLeftRadius = ta.getDimension(R.styleable.ShapeTextView_bottomLeftRadius, 0); bottomRightRadius = ta.getDimension(R.styleable.ShapeTextView_bottomRightRadius, 0); shapeTpe = ta.getInt(R.styleable.ShapeTextView_shapeTpe, GradientDrawable.RECTANGLE); ta.recycle(); if (strokeColor != 0 && strokeWith > 0) { paintStroke = new Paint(); paintStroke.setColor(strokeColor); paintStroke.setStyle(Paint.Style.STROKE); paintStroke.setStrokeWidth(strokeWith); paintStroke.setAntiAlias(true); } paint = new Paint(); paint.setColor(solidColor); paint.setAntiAlias(true); paint.setStyle(Paint.Style.FILL); if (radius == 0 && shapeTpe == GradientDrawable.RECTANGLE) { path = new Path(); //顺时针绘制 左上 右上 右下 左下 radii = new float[]{topLeftRadius, topLeftRadius, topRightRadius, topRightRadius, bottomRightRadius, bottomRightRadius, bottomLeftRadius, bottomLeftRadius}; } } private final RectF mRect = new RectF(); //创建一个画笔 private Paint paintStroke; private Paint paint; private Path path; float[] radii; public void setAllColor(int soilColor, int strokeColor, int textColor) { this.solidColor = soilColor; this.strokeColor = strokeColor; this.textColor = textColor; if (solidColor != 0) paint.setColor(solidColor); if (paintStroke != null) paintStroke.setColor(strokeColor); setTextColor(textColor); invalidate(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); mRect.set(strokeWith, strokeWith, getWidth() - strokeWith, getHeight() - strokeWith); if (path != null) path.addRoundRect(mRect, radii, Path.Direction.CW); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); mRect.set(strokeWith, strokeWith, getWidth() - strokeWith, getHeight() - strokeWith); } @Override protected void onDraw(Canvas canvas) { mRect.set(strokeWith, strokeWith, getWidth() - strokeWith, getHeight() - strokeWith); if (shapeTpe == GradientDrawable.RECTANGLE) { if (radius == 0) { canvas.drawPath(path, paint); if (paintStroke != null) canvas.drawPath(path, paintStroke); } else { canvas.drawRoundRect(mRect, radius, radius, paint); if (paintStroke != null) canvas.drawRoundRect(mRect, radius, radius, paintStroke); } } else { canvas.drawOval(mRect, paint); if (paintStroke != null) canvas.drawOval(mRect, paintStroke); } super.onDraw(canvas); } @Override public boolean onTouchEvent(MotionEvent event) { if (solidTouchColor != 0 || strokeTouchColor != 0 || textTouchColor != 0) { if (event.getAction() == MotionEvent.ACTION_DOWN || event.getAction() == MotionEvent.ACTION_MOVE) { if (event.getAction() == MotionEvent.ACTION_DOWN) drowBackgroud(true); } else { drowBackgroud(false); } } return super.onTouchEvent(event); } /** * 设置按下颜色值 */ private void drowBackgroud(boolean isTouch) { if (isTouch) { if (solidTouchColor != 0) paint.setColor(solidTouchColor); if (paintStroke != null) paintStroke.setColor(strokeTouchColor); if (textTouchColor != 0) setTextColor(textTouchColor); } else { if (solidColor != 0) paint.setColor(solidColor); if (paintStroke != null) paintStroke.setColor(strokeColor); if (textTouchColor != 0) setTextColor(textColor); } invalidate(); } }