自定义MarketCircleView控件,实现圆环

    xiaoxiao2021-03-25  70

    public class MarketCircleView extends View {     private Context mContext;     /**      * view宽度      */     private int mWidth;     /**      * view高度      */     private int mHeight;     private int mPaddingStart;     private int mPaddingEnd;     private int mPaddingTop;     private int mPaddingBottom;     // view开始X坐标点     private int mLeft;     // view开始y坐标点     private int mTop;     // view结束X坐标点     private int mRight;     // view结束y坐标点     private int mBottom;     /**      * 圆环的颜色      */     private int roundColor;     /**      * 圆环里面字颜色      */     private int circleTextColor;     /**      * 中间圆环名称的颜色      */     private int cicleTextColor;     /**      * 中间圆环名称的大小      */     private int cicleTextSize;     /**      * 右侧净买入      */     private String netPurchaseText = "净买入";     /**      * 右侧余额      */     private String balanceText = "余额";     /**      * 右侧净买入、余额字体大小      */     private int tipTextSize;     /**      * 净买入:百分比显示的颜色      */     private int roundProgressColor;     /**      * 画笔      */     private Paint mPaint;     /**      * 圆环宽度      */     private float roundWidth;     /**      * 数据源      */     MarketItemModel marketCicleModel;     public MarketCircleView(Context context) {         super(context);         init();     }     public MarketCircleView(Context context, AttributeSet attrs) {         super(context, attrs);         mContext = context;         init();     }     private void init() {         mPaint = new Paint();         mPaint.setStrokeWidth(0.5f);         mPaint.setAntiAlias(true);         cicleTextSize = StringUtils.dipToPx(12);         tipTextSize = StringUtils.dipToPx(11);         roundColor = 0xffcccccc;         if (CommonValue.styleType == CommonValue.StyleType.STYLE_WHITE) {             circleTextColor = 0xFF000000;         } else {             circleTextColor = 0xFFFFFFFF;         }     }     @Override     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {         mWidth = getSizeFromMeasureSpec(widthMeasureSpec, 480);         mHeight = getSizeFromMeasureSpec(heightMeasureSpec, 480);         mPaddingStart = getPaddingLeft();         mPaddingEnd = getPaddingRight();         mPaddingTop = getPaddingTop();         mPaddingBottom = getPaddingBottom();         mLeft = mPaddingStart;         mTop = mPaddingTop;         mRight = mWidth - mPaddingEnd;         mBottom = mHeight - mPaddingBottom;         setMeasuredDimension(mWidth, mHeight);     }     // 绘制大圆环     private void drawCicle(Canvas canvas) {         // 设置圆环         int centerX = mLeft + (mRight - mLeft) / 4;// 获取圆心的x坐标,视图宽度的1\4作为圆心         int centerY = mTop + (mBottom - mTop) / 2;// 获取圆心的Y坐标         roundWidth = (mRight - mLeft) / 20;         int radius = (int) ((mRight - mLeft) / 4 - roundWidth); // 圆环的半径         if (centerY < radius) {             centerY = centerX;         }         mPaint.setColor(roundColor); // 设置圆环的颜色         mPaint.setStrokeWidth(roundWidth);         mPaint.setStyle(Paint.Style.STROKE); // 设置空心         canvas.drawCircle(centerX, centerY, radius, mPaint); // 画出圆环         mPaint.setStrokeWidth(0);         mPaint.setColor(circleTextColor);         mPaint.setTextSize(cicleTextSize);         float textWidth = mPaint.measureText("沪港通");         if (null != marketCicleModel) {             if (null != marketCicleModel.name && marketCicleModel.name.length() > 3) {                 canvas.drawText(marketCicleModel.name.substring(0, 3), centerX - textWidth / 2, centerY                         , mPaint); // 画出净买入占余额比例                 float tempTextWidth = mPaint.measureText("(沪)");                 canvas.drawText(marketCicleModel.name.substring(3, marketCicleModel.name.length()), centerX - tempTextWidth / 2, centerY                         + cicleTextSize, mPaint); // 画出净买入占余额比例             } else {                 canvas.drawText(marketCicleModel.name, centerX - textWidth / 2, centerY                         + cicleTextSize / 2, mPaint); // 画出净买入占余额比例             }         }         // 设置比例是实心还是空心         mPaint.setStrokeWidth(roundWidth); // 设置圆环的宽度         if (null != marketCicleModel && marketCicleModel.directColor != 0) {             mPaint.setColor(marketCicleModel.directColor); // 设置比例的颜色         }         RectF oval = new RectF(centerX - radius, centerY - radius, centerX                 + radius, centerY + radius); // 用于定义的圆弧的形状和大小的界限         mPaint.setStyle(Paint.Style.STROKE);         if (null != marketCicleModel && marketCicleModel.captialDirect != 0 && marketCicleModel.captialLeft != 0) {             float rate = 360                     * Math.abs(marketCicleModel.captialDirect)                     / (Math.abs(marketCicleModel.captialDirect) + Math                     .abs(marketCicleModel.captialLeft));             canvas.drawArc(oval, 270, rate, false, mPaint); // 根据进度画圆弧         }         drawText(canvas, centerY, radius);     }     // 绘制右方数字     private void drawText(Canvas canvas, int centerY, int radius) {         try {             // “净买入”三个字             mPaint.setStrokeWidth(0);             mPaint.setColor(circleTextColor);             mPaint.setTextSize(tipTextSize);             float tipTextWidth = mPaint.measureText(netPurchaseText) / 3;             canvas.drawText(netPurchaseText, mWidth / 2 + tipTextWidth, centerY                     - (radius - tipTextWidth/2), mPaint); // 画出净买入占余额比例             // “净买入”金额             mPaint.setColor(marketCicleModel.directColor);             mPaint.setTextSize(cicleTextSize);             String capitalDirect = "";             capitalDirect = CommonFunc.fixTText(marketCicleModel.captialDirect, 2);             canvas.drawText(capitalDirect + "", mWidth / 2                     + tipTextWidth, centerY - (radius - (2 * tipTextWidth)), mPaint); // 画出净买入占余额比例             // “余额”两个字             mPaint.setColor(circleTextColor);             mPaint.setTextSize(tipTextSize);             canvas.drawText(balanceText, mWidth / 2 + tipTextWidth, centerY                     + (radius - (3 * tipTextWidth / 2)), mPaint); // 画出净买入占余额比例             // “余额”金额             String captialLeft = "";             captialLeft = CommonFunc.fixTText(marketCicleModel.captialLeft, 2);             mPaint.setTextSize(cicleTextSize);             canvas.drawText(captialLeft + "", mWidth / 2                     + tipTextWidth, centerY + radius, mPaint); // 画出净买入占余额比例         } catch (Exception ex) {         }     }     @Override     protected void onDraw(Canvas canvas) {         super.onDraw(canvas);         drawCicle(canvas);     }     public int getRoundColor() {         return roundColor;     }     public void setRoundColor(int roundColor) {         this.roundColor = roundColor;     }     public int getCicleTextColor() {         return cicleTextColor;     }     public void setCicleTextColor(int cicleTextColor) {         this.cicleTextColor = cicleTextColor;     }     public int getRoundProgressColor() {         return roundProgressColor;     }     public void setRoundProgressColor(int roundProgressColor) {         this.roundProgressColor = roundProgressColor;     }     public MarketItemModel getMarketCicleModel() {         return marketCicleModel;     }     public void setMarketCicleModel(MarketItemModel marketCicleModel) {         this.marketCicleModel = marketCicleModel;         postInvalidate();     }     // 工具类     public static int getSizeFromMeasureSpec(int measureSpec, int defaultSize) {         int result = 0;         int mode = MeasureSpec.getMode(measureSpec);         int size = MeasureSpec.getSize(measureSpec);         if (mode == MeasureSpec.EXACTLY) {             result = size;         } else {             result = defaultSize;             if (mode == MeasureSpec.AT_MOST) {                 result = Math.min(defaultSize, size);             }         }         return result;     } }
    转载请注明原文地址: https://ju.6miu.com/read-40488.html

    最新回复(0)