Android 仪表盘组件范例,需要稍加修改即可。

前端之家收集整理的这篇文章主要介绍了Android 仪表盘组件范例,需要稍加修改即可。前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

下面是编程之家 jb51.cc 通过网络收集整理的代码片段。

编程之家小编现在分享给大家,也给大家做个参考。

支持android 2.2以上平台。注:
代码中有用到一个工具类的dpToPx的方法,用来转换dp单位值到px的,暂时没有提供,朋友们可以自行编写然后对代码进行替换。

在activity中使用,下面是范例代码,   至于怎么正确放置代码,相信做过android的朋友都很熟悉了。

           FinancescoreDialView fcdView =new  FinancescoreDialView(context);
           addview(fcdView);

            fcdView.setValues(new double[]{80.5, 10});
            fcdView.setscoreTitleString("第三季度");
            fcdView.setRankingTitleString("行业排名");
            fcdView.setscoreTitleColor(0xff666666);
            fcdView.setscoreColor(0xffc1611e);
            fcdView.setRankingTitleColor(0xff666666);
            fcdView.setRankingColor(Color.WHITE);

            fcdView.setInnerscoreRingColor(0xffc1ddf9);
            fcdView.setOuterscoreRingColor(0xff328deb);
            fcdView.setOuterscoreSelRingColor(0xffc1611e);
            fcdView.setscoreAxisLineColor(0xff00ff00);
            fcdView.setscoreAxisLables(5);

            fcdView.postInvalidate();
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));
    }

}

以上是编程之家(jb51.cc)为你收集整理的全部代码内容,希望文章能够帮你解决所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

猜你在找的Java相关文章