The Android dashboard component example needs to be slightly modified.

Here is the programming house jb51 CC collects and arranges code fragments through the network.

Programming house Xiaobian now shares it with you and gives you a reference.

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.view.View;

import java.text.NumberFormat;


class FinancescoreDialView extends  View{

    private double score;   //

    private int ranking;

    private String mscoreTitleStr;     //表盘标题
    private String mRankingTitleStr;   
    private int mscoreAxisLineColor;   //表盘刻度文字

    public void setscoreTitleColor(int mscoreTitleColor) {
        this.mscoreTitleColor = mscoreTitleColor;
    }

    public void setscoreColor(int mscoreColor) {
        this.mscoreColor = mscoreColor;
    }

    public void setRankingTitleColor(int mRankingTitleColor) {
        this.mRankingTitleColor = mRankingTitleColor;
    }

    public void setRankingColor(int mRankingColor) {
        this.mRankingColor = mRankingColor;
    }

    private int mscoreTitleColor;  //表盘标题文字颜色
    private int mscoreColor;      
    private int mRankingTitleColor;
    private int mRankingColor;

    public void setInnerscoreRingColor(int mInnerscoreRingColor) {
        this.mInnerscoreRingColor = mInnerscoreRingColor;
    }

    public void setOuterscoreRingColor(int mOuterscoreRingColor) {
        this.mOuterscoreRingColor = mOuterscoreRingColor;
    }

    public void setOuterscoreSelRingColor(int mOuterscoreSelRingColor) {
        this.mOuterscoreSelRingColor = mOuterscoreSelRingColor;
    }

    public void setscoreAxisLineColor(int axisLineColor){
        this.mscoreAxisLineColor = axisLineColor;
    }

    private int mInnerscoreRingColor;
    private int mOuterscoreRingColor;
    private int mOuterscoreSelRingColor;

    private float totalscore = 100;

    private float stepDegree = -1;

    public void setscoreAxisLables(int scoreAxisLables) {
        this.scoreAxisLables = scoreAxisLables;

        axisLabelStrs = new String[scoreAxisLables];

        float step = totalscore / (scoreAxisLables-1);

        for (int i =0; i< scoreAxisLables; i++){
            axisLabelStrs[i] = String.valueOf(nFormat2.format(step *i));
        }

        float sweepAngle = 180+Math.abs(2*offset_degree);

        stepDegree = sweepAngle/(scoreAxisLables-1);


    }

    private int scoreAxisLables;
    private String[] axisLabelStrs;

    private float axisLineWidth = Tool.dpToPx(0.5f);


    private float axisLableTextSize = Tool.dpToPx(12);

    private Paint axisLablePaint = new Paint();


    private float leftmargin = Tool.dpToPx(5);

    private float v_margin = Tool.dpToPx(15);

    private float h_space  = Tool.dpToPx(15);

    private float ring_space = Tool.dpToPx(5);

    private float outter_ringWidth = Tool.dpToPx(1);

    private float inner_ringWidth = Tool.dpToPx(5);


    private Paint rankingTextPaint = new Paint();
    private Paint scoreTextPaint = new Paint();

    private Paint scoreRingPaint = new Paint();

    private float scoreTitleTextSize = Tool.dpToPx(14);
    private float rankingTitleTextSize = Tool.dpToPx(14);
    private float scoreTextSize  = Tool.dpToPx(40);
    private float rankingTextSize  = Tool.dpToPx(30);

    private static final float offset_degree = -10;  //负代表往下偏移10度


    private float maxOutterscoreDiameter = -1;

    private float maxOutterscoreRadius = -1;

    private float innerscoreDiameter = -1;

    private RectF ring_rectf = new RectF();

    private static NumberFormat nFormat = NumberFormat.getNumberInstance();
    private static NumberFormat nFormat2 = NumberFormat.getNumberInstance();

    static{
        nFormat.setMaximumFractionDigits(2);
        nFormat.setMinimumFractionDigits(2);

        nFormat2.setMaximumFractionDigits(0);
    }



    public FinancescoreDialView(Context context) {
        super(context);
        init();
    }

    private void init(){
        rankingTextPaint.setAntiAlias(true);
        scoreTextPaint.setAntiAlias(true);
        scoreRingPaint.setAntiAlias(true);
    }

    public void setValues(double[] values){
        if(null != values){
            if(values.length >0){
                score = values[0];
            }

            if(values.length >1 ){
                ranking = (int)values[1];
            }
        }
    }

    public void setscoreTitleString(String str){
        this.mscoreTitleStr = str;

    }

    public void setRankingTitleString(String str){
        this.mRankingTitleStr = str;
    }

    public  void onMeasure(int widthMeasureSpec,int heightMeasureSpec){
        int specWidth = MeasureSpec.getSize(widthMeasureSpec);
        int measuredWidth = specWidth;

        int measuredHeight = 0;

        scoreTextPaint.setTextSize(scoreTitleTextSize);
        float scoretitle_h  = getFontHeight(scoreTextPaint);
        float scoretitle_w = scoreTextPaint.measureText(mscoreTitleStr);

        scoreTextPaint.setTextSize(scoreTextSize);
        float score_h  = getFontHeight(scoreTextPaint);
        float score_w = scoreTextPaint.measureText(nFormat.format(score));


        float totalh_score = scoretitle_h + Tool.dpToPx(5) + score_h;
        float totalw_score = Math.max(scoretitle_w,score_w) + 2*Tool.dpToPx(20);

        float score_diameter = Math.max(totalw_score,totalh_score);

        float max_outter_score_diameter = score_diameter + 2* (inner_ringWidth + ring_space + outter_ringWidth);

        maxOutterscoreDiameter = max_outter_score_diameter;

        innerscoreDiameter = max_outter_score_diameter - 2*(outter_ringWidth + ring_space);

        float max_outter_score_radius = max_outter_score_diameter/2;
        maxOutterscoreRadius = max_outter_score_radius;
        measuredHeight += max_outter_score_radius;

        double rAngle = Math.toradians(90 - (-180 + offset_degree));

        measuredHeight += Math.abs(max_outter_score_radius*Math.cos(rAngle));
        measuredHeight += 2*v_margin;


        setMeasuredDimension(measuredWidth,measuredHeight);


    }

    public void onDraw(Canvas canvas){

        int startX = getScrollX();
        int startY = getScrollY();

        rankingTextPaint.setTextSize(rankingTitleTextSize);
        rankingTextPaint.setColor(mRankingTitleColor);

        float rankingTitleBaseline = startY + v_margin + getFontTopYToBaseline(rankingTextPaint);
        canvas.drawText(mRankingTitleStr,startX + leftmargin,rankingTitleBaseline,rankingTextPaint);


        float rankingTitle_w = rankingTextPaint.measureText(mRankingTitleStr);

        //圆心纵横坐标
        float centerX  = startX + leftmargin + h_space + rankingTitle_w + maxOutterscoreDiameter/2;
        float centerY =startY + v_margin + maxOutterscoreDiameter/2;


        float max_outter_ring_startX = centerX - maxOutterscoreDiameter/2 + outter_ringWidth/2;
        float max_outter_ring_startY = v_margin + outter_ringWidth/2;
        float max_outter_ring_endX = max_outter_ring_startX + maxOutterscoreDiameter - outter_ringWidth;
        float max_outter_ring_endY = max_outter_ring_startY + maxOutterscoreDiameter - outter_ringWidth;

        ring_rectf.set(max_outter_ring_startX,max_outter_ring_startY,max_outter_ring_endX,max_outter_ring_endY);

        scoreRingPaint.setStyle(Paint.Style.stroke);
        scoreRingPaint.setstrokeWidth(outter_ringWidth);

        scoreRingPaint.setColor(mOuterscoreRingColor);

        float startAngle = -180 + offset_degree;
        float sweepAngle = 180+Math.abs(2*offset_degree);

        float sweepAngle1 = (float)(sweepAngle * score/ totalscore);

        if(sweepAngle1 > sweepAngle || (sweepAngle-sweepAngle1<1)){
            sweepAngle1 = sweepAngle;
        }



        canvas.drawArc(ring_rectf,startAngle,sweepAngle,false,scoreRingPaint );    //画外环

        scoreRingPaint.setColor(mOuterscoreSelRingColor);
        canvas.drawArc(ring_rectf,sweepAngle1,scoreRingPaint );

        float inner_ring_startX = centerX - innerscoreDiameter/2 + inner_ringWidth/2;
        float inner_ring_startY = centerY - innerscoreDiameter/2 + inner_ringWidth/2;
        float inner_ring_endX = inner_ring_startX + innerscoreDiameter - inner_ringWidth;
        float inner_ring_endY = inner_ring_startY + innerscoreDiameter - inner_ringWidth;

        ring_rectf.set(inner_ring_startX,inner_ring_startY,inner_ring_endX,inner_ring_endY);

        scoreRingPaint.setstrokeWidth(inner_ringWidth);
        scoreRingPaint.setColor(mInnerscoreRingColor);
        canvas.drawArc(ring_rectf,scoreRingPaint);

        for (int i =0; i<scoreAxisLables; i++){
            float degree = -1;

            degree =  -180 + offset_degree + stepDegree * i;

            double radian = Math.toradians(90-degree);

            float shorTradius = innerscoreDiameter/2 - inner_ringWidth;
            float longRadius = innerscoreDiameter/2;

            double sinValue = Math.sin(radian);
                    double cosValue = Math.cos(radian);

            float x1 =  (float) (centerX +shorTradius * sinValue);
            float y1 = (float)(centerY +shorTradius * cosValue);
            float x2 = (float)(centerX +  longRadius * sinValue);
            float y2 = (float)(centerY + longRadius * cosValue);

            scoreRingPaint.setStyle(Paint.Style.stroke);
            scoreRingPaint.setstrokeWidth(axisLineWidth);
            scoreRingPaint.setColor(mscoreAxisLineColor);



            canvas.drawLine(x1,y1,x2,y2,scoreRingPaint);


            axisLablePaint.setTextSize(axisLableTextSize);
            axisLablePaint.setTextAlign(Paint.Align.CENTER);
            axisLablePaint.setColor(mInnerscoreRingColor);

            float axisLable_fonth = getFontHeight(axisLablePaint);
            float labelRadius =innerscoreDiameter/2 - inner_ringWidth - axisLable_fonth/2 + 3;

            float x3 =  (float) (centerX + labelRadius * sinValue);
                    float y3  =(float) (centerY + labelRadius * cosValue);

            canvas.save();

            canvas.rotate(90+ degree,x3,y3);    //绘制倾斜文字


            canvas.drawText(axisLabelStrs[i],y3 + getFontCenterYToBaseLine(axisLablePaint),axisLablePaint);

            canvas.restore();

        }


        scoreTextPaint.setTextAlign(Paint.Align.CENTER);
        scoreTextPaint.setTextSize(scoreTextSize);
        scoreTextPaint.setColor(mscoreColor);

        double rAngle = Math.toradians(90 - (-180 + offset_degree));    //弧度

        float offset_y = (float)(maxOutterscoreRadius*Math.cos(rAngle));

        float scoreBaselineY = centerY + offset_y;
        float tempH = getFontTopYToBaseline(scoreTextPaint);

        canvas.drawText(nFormat.format(score),centerX,scoreBaselineY,scoreTextPaint);

        scoreTextPaint.setTextSize(scoreTitleTextSize);
        scoreTextPaint.setColor(mscoreTitleColor);

        float scoreTitleBaselineY = scoreBaselineY - tempH - Tool.dpToPx(2);

        canvas.drawText(mscoreTitleStr,scoreTitleBaselineY,scoreTextPaint);


    }


    public static float getFontHeight(Paint textPaint){

        Paint.FontMetrics fm = textPaint.getFontMetrics();

        return (float)Math.ceil(fm.descent - fm.ascent) + 3;
    }


    public static float getFontTopYToBaseline(Paint textPaint){
        Paint.FontMetrics fm = textPaint.getFontMetrics();

        return (float)Math.ceil(-fm.ascent) + 3;
    }

    public static float getFontBottomYToBaseline(Paint textPaint){
        Paint.FontMetrics fm = textPaint.getFontMetrics();

        return (float)Math.ceil(fm.descent) + 3;
    }

    public static float getFontCenterYToBaseLine(Paint textPaint){
        Paint.FontMetrics fm = textPaint.getFontMetrics();

        float fonth = getFontHeight(textPaint);

        return (float)Math.abs(Math.ceil(fonth/2- fm.descent));
    }

}

The above is all the code content collected by the programming home (jb51. CC). I hope this article can help you solve the program development problems you encounter.

If you think the content of the programming home website is good, you are welcome to recommend the programming home website to programmers and friends.

The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
分享
二维码
< <上一篇
下一篇>>