content: package com.rsen.github.tablayout;
  
  import android.content.Context;
  import android.content.res.TypedArray;
  import android.graphics.Color;
  import android.graphics.drawable.GradientDrawable;
  import android.graphics.drawable.StateListDrawable;
  import android.os.Build;
  import android.util.AttributeSet;
  import android.widget.TextView;
  
  /**
   * 用于需要圆角矩形框背景的TextView的情况,减少直接使用TextView时引入的shape资源文件
   */
  public class MsgView extends TextView {
      private Context context;
      private GradientDrawable gd_background = new GradientDrawable();
      private int backgroundColor;
      private int cornerRadius;
      private int strokeWidth;
      private int strokeColor;
      private boolean isRadiusHalfHeight;
      private boolean isWidthHeightEqual;
  
      public MsgView(Context context) {
          this(context, null);
      }
  
      public MsgView(Context context, AttributeSet attrs) {
          this(context, attrs, 0);
      }
  
      public MsgView(Context context, AttributeSet attrs, int defStyleAttr) {
          super(context, attrs, defStyleAttr);
          this.context = context;
          obtainAttributes(context, attrs);
      }
  
      private void obtainAttributes(Context context, AttributeSet attrs) {
          TypedArray ta = context.obtainStyledAttributes(attrs, com.angcyo.rsen.R.styleable.MsgView);
          backgroundColor = ta.getColor(com.angcyo.rsen.R.styleable.MsgView_mv_backgroundColor, Color.TRANSPARENT);
          cornerRadius = ta.getDimensionPixelSize(com.angcyo.rsen.R.styleable.MsgView_mv_cornerRadius, 0);
          strokeWidth = ta.getDimensionPixelSize(com.angcyo.rsen.R.styleable.MsgView_mv_strokeWidth, 0);
          strokeColor = ta.getColor(com.angcyo.rsen.R.styleable.MsgView_mv_strokeColor, Color.TRANSPARENT);
          isRadiusHalfHeight = ta.getBoolean(com.angcyo.rsen.R.styleable.MsgView_mv_isRadiusHalfHeight, false);
          isWidthHeightEqual = ta.getBoolean(com.angcyo.rsen.R.styleable.MsgView_mv_isWidthHeightEqual, false);
  
          ta.recycle();
      }
  
      @Override
      protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
          if (isWidthHeightEqual() && getWidth() > 0 && getHeight() > 0) {
              int max = Math.max(getWidth(), getHeight());
              int measureSpec = MeasureSpec.makeMeasureSpec(max, MeasureSpec.EXACTLY);
              super.onMeasure(measureSpec, measureSpec);
              return;
          }
  
          super.onMeasure(widthMeasureSpec, heightMeasureSpec);
      }
  
      @Override
      protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
          super.onLayout(changed, left, top, right, bottom);
          if (isRadiusHalfHeight()) {
              setCornerRadius(getHeight() / 2);
          } else {
              setBgSelector();
          }
      }
  
      public void setIsRadiusHalfHeight(boolean isRadiusHalfHeight) {
          this.isRadiusHalfHeight = isRadiusHalfHeight;
          setBgSelector();
      }
  
      public void setIsWidthHeightEqual(boolean isWidthHeightEqual) {
          this.isWidthHeightEqual = isWidthHeightEqual;
          setBgSelector();
      }
  
      public int getBackgroundColor() {
          return backgroundColor;
      }
  
      public void setBackgroundColor(int backgroundColor) {
          this.backgroundColor = backgroundColor;
          setBgSelector();
      }
  
      public int getCornerRadius() {
          return cornerRadius;
      }
  
      public void setCornerRadius(int cornerRadius) {
          this.cornerRadius = dp2px(cornerRadius);
          setBgSelector();
      }
  
      public int getStrokeWidth() {
          return strokeWidth;
      }
  
      public void setStrokeWidth(int strokeWidth) {
          this.strokeWidth = dp2px(strokeWidth);
          setBgSelector();
      }
  
      public int getStrokeColor() {
          return strokeColor;
      }
  
      public void setStrokeColor(int strokeColor) {
          this.strokeColor = strokeColor;
          setBgSelector();
      }
  
      public boolean isRadiusHalfHeight() {
          return isRadiusHalfHeight;
      }
  
      public boolean isWidthHeightEqual() {
          return isWidthHeightEqual;
      }
  
      protected int dp2px(float dp) {
          final float scale = context.getResources().getDisplayMetrics().density;
          return (int) (dp * scale + 0.5f);
      }
  
      protected int sp2px(float sp) {
          final float scale = this.context.getResources().getDisplayMetrics().scaledDensity;
          return (int) (sp * scale + 0.5f);
      }
  
      private void setDrawable(GradientDrawable gd, int color, int strokeColor) {
          gd.setColor(color);
          gd.setCornerRadius(cornerRadius);
          gd.setStroke(strokeWidth, strokeColor);
      }
  
      public void setBgSelector() {
          StateListDrawable bg = new StateListDrawable();
  
          setDrawable(gd_background, backgroundColor, strokeColor);
          bg.addState(new int[]{-android.R.attr.state_pressed}, gd_background);
  
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {//16
              setBackground(bg);
          } else {
              //noinspection deprecation
              setBackgroundDrawable(bg);
          }
      }
  }
  