自定义MarketCircleView控件,实现圆环

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;
    }


}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值