精华内容
下载资源
问答
  • android:仪表盘(简单易实现)

    热门讨论 2013-08-26 16:27:23
    很多仪表盘的例子比较复杂,我这个仪表盘的例子将一部分复杂成分转移给了美工人员,而在代码上非常简单明了。
  • Android仪表盘

    2015-03-13 16:48:42
    用自定义view实现仪表盘效果.全部用canvas实现.不需要美工图片.下载后直接导入eclipse就可以运行.
  • 该源码实现了仪表盘显示数据动画效果,源码KankanDashBoard,做了一个奶站项目,需要有图表统计,所以做了这个仪表盘效果。 让美工随手皮的图,大家可以一起学习嘛。
  • echarts仪表盘点击打分实现

    万次阅读 2019-06-02 21:50:40
    项目中需要使用仪表盘来做一个打分的功能,·下面是一个官网的仪表盘,是没有刻度的点击事件的,所以就要手动实现一个了, 思路 这里的一个方框指的是一个canvas,然后根据比例获取到仪表盘的一个中心,然后根据...

    Echarts仪表盘刻度点击

    项目中需要使用仪表盘来做一个打分的功能,·下面是一个官网的仪表盘,是没有刻度的点击事件的,所以就要手动实现一个了,

    在这里插入图片描述

    思路

    这里的一个方框指的是一个canvas,然后根据比例获取到仪表盘的一个中心,然后根据鼠标点击的相对canvas的坐标值,能够算出指针角度的tan值,然后根据tan值来判断指针所指的刻度,然后设值渲染。
    在这里插入图片描述

    这边就直接上代码了。

    <div v-bind:id="'echart'+ec.name" style="width: 100%;height:85%" @click="setScore($event)"></div>
    
    methods: {
          setScore(e) {
            /**
             * 
             * 
             * e.layerX 鼠标相对canvas X轴的位置
             * e.layerY 鼠标相对canvas Y轴的位置
             * centerX  更具比例得到指针中心的X轴位置
             * centerY  根据比例得到指针中心的Y轴位置
             * 
             * rate     得到点击点 到指针中心的 一个比例,即 左角度的tan值
             * 
             * 各个分段的取值   
             *  score     [3]     [4]       [5]        [1]     [2]      [5]
             * 坐标轴          -2      -0.4        原点     0.4       2
             */
            var chart = e.path[2].id;
            var score = 1;
            var echart = document.getElementsByTagName("canvas")[5]
            var centerX = echart.clientWidth * 0.53
            var centerY = echart.clientHeight * 0.69
            var rate = (centerY - e.layerY) / (centerX - e.layerX)
            // console.log(e.layerX + " " + e.layerY)
            // console.log("centerX" + centerX + "--" + "cenerY" + centerY + "==" + rate)
            //如果点击再 指针的下面,就没反映,
            if (centerY < e.layerY) {
              return;
            }
            if (rate < 0.4 && rate > 0) {
              score = 1;
            } else if (rate < 2 && rate > 0.4) {
              score = 2;
            } else if (rate > 2 || rate < -2) {
              score = 3;
            } else if (rate < 0 && rate > -0.4) {
              score = 5
            } else {
              score = 4
            }
            //重新加载echart
            let myChart = this.$echarts.init(document.getElementById(chart));
            this.option1.series[0].data[0].value = score;
            myChart.setOption(this.option1, true);
            this.$nextTick(function () {
              myChart.resize();
            })
          },
    

    这是仪表盘的控件,给定一个点击事件setScore($event),代码中注释已经给的很明确了,有什么问题的地方可以留言我哈,

    最后

    给出最后的效果图,当然这个样式是美工调出来的啦,
    在这里插入图片描述

    最后,可以留一个问题,根据鼠标悬停将指针移动到指针的位置,就是指针跟鼠标走,大家有兴趣可以自己实现看看啊哈哈

    展开全文
  • highcharts个性化仪表盘

    2018-04-13 14:45:00
    一、背景:之前使用过echarts图表,最新公司根据客户需求准备开发个仪表盘美工出图如下。  由于公司产品集成highcharts,发现highcharts仪表盘不满足需求,顾个性化开发。 二、过程: echarts:百度开发,...

    一、背景:之前使用过echarts图表,最新公司根据客户需求准备开发个仪表盘美工出图如下。

     

      由于公司产品集成highcharts,发现highcharts仪表盘不满足需求,顾个性化开发。

    二、过程:

    echarts:百度开发,Api目前支持不好,主要采用canvas画图。

    highcharts: 国外产品,Api全面,还有各路大神的个性化图表,主要采用svg画图。 

    也有人说:echarts相当于中国的WPS,而highchart相当于微软office

    建议,如果使用百度地图展示图表,那么使用echarts(ps:支持国产)

    如果以上两款不满足需求,那么可以上手 d3js,图表更多更强大。

      官网地址:  https://github.com/d3/d3/wiki/Gallery

      api地址(中文的):https://github.com/d3/d3/wiki/API--%E4%B8%AD%E6%96%87%E6%89%8B%E5%86%8C

    三、结果:

    上图:(虽然差别还是有,基本满足需求)

    上代码:https://code.hcharts.cn/demos/hhhhiD 打开地址,直接复制粘贴,运行看结果。

    js:

    // 公共配置
    Highcharts.setOptions({
        chart: {
            type: 'solidgauge'
        },
        title: {
            text: '',
        },
        pane: {
            center: ['50%', '60%'],
            size: '100%',
            startAngle: -140,
            endAngle: 140,
            background: {
                backgroundColor: (Highcharts.theme && Highcharts.theme.background2) || '#fff',
                innerRadius: '60%',
                outerRadius: '100%',
                shape: 'arc'
            }
        },
        tooltip: {
            enabled: false
        },
        yAxis: {
            plotBands: {
                //borderColor:'#000000',
               // borderWidth:0,
                from: 0,
                to: 250,
                color: '#FFCCFF' // green
            },
            stops: [
                [0.1, '#55BF3B'], // green
                [0.5, '#DDDF0D'], // yellow
                [0.7, '#DF5353'] // red
            ],
            lineWidth: 0,
            minorTickInterval: null,
            tickPixelInterval: 100,//像素间隔
            tickWidth: 2,
            tickAmount: 10,//刻度总数
            tickPosition: 'inside',// 刻度线位置 内外
            tickLength: 15,
            //tickmarkPlacement:'between',
            tickColor: '#ffffff',
            // visible:false,//坐标轴是否显示
            title: {
                y: -50
            },
            labels: {
                enabled:false,
                y: 16
            }
        },
        plotOptions: {
            solidgauge: {
                dataLabels: {
                    y: -20,
                    borderWidth: 0,
                    useHTML: true
                }
            }
        }
    });
    // 速度仪表
    var chart1 = Highcharts.chart('container-qtd', {
        yAxis: {
            min: 0,
            max: 200,
            title: {
                text: 'QTD'
            }
        },
        credits: {
            enabled: false
        },
        series: [{
            data: [{
                y:150,
                innerRadius: 80,
                // radius: 98,
                name:'dd',
            }],
            dataLabels: {
                style: {
                    fontWeight: 'bold',
                    fontSize: '20px',
                    color: 'black'
                },
                format: '<div style="text-align:center"><span style="font-size:25px;color:' +
                ((Highcharts.theme && Highcharts.theme.contrastTextColor) || 'black') + '">{y}%</span><br/>' +
                '<span style="font-size:12px;color:silver">2462M</span></div>'
            }
        }]
    });
    // 转速仪表
    var chart2 = Highcharts.chart('container-mtd', {
        yAxis: {
            min: 0,
            max: 150,
            title: {
                text: 'MTD'
            }
        },
        credits: {//取消官网链接highcharts.com
            enabled: false,
            //添加自己的链接地址
            // text: 'www.baidu.com',
            //  href: 'https://www.baidu.com'
        },
        series: [{
            name: 'RPM',
            data: [{
                y:58,
                innerRadius: 80,
                // radius: 98,
                name:'dd',
            }],
            dataLabels: {
                style: {
                    fontWeight: 'bold',
                    fontSize: '20px',
                    color: 'black'
                },
                format: '<div style="text-align:center"><span style="font-size:25px;color:' +
                ((Highcharts.theme && Highcharts.theme.contrastTextColor) || 'black') + '">{y}%</span><br/>' +
                '<span style="font-size:12px;color:silver">58M</span></div>'
            }
        }]
    });

    html:

    <div style="width: 600px; height: 300px; margin: 0 auto">
        <div id="container-qtd" style="width: 300px; height: 200px; float: left">
        </div>
        <div id="container-mtd" style="width: 300px; height: 200px; float: left">
        </div>
    </div>

     

     

    后记:

      当图表值太大,有时间图表显示不全,显示一半,官方解释:https://api.hcharts.cn/highcharts#yAxis.max

      max值自动向上取整问题,刻度线 tickAmount导致的。

       tickAmount不设置就不会影响最大值问题。即max设置多少显示多少,

       tickAmount设置为null、 0、2 都不管用。直接删掉就好!不需要设置!!!

     

    转载于:https://www.cnblogs.com/start-fxw/p/8820279.html

    展开全文
  • 手把手教你玩转iOS的仪表盘

    千次阅读 2016-09-12 10:04:02
    刚开始的时候,万恶的美工告诉我说,每个仪表盘的度数、报警值是一样的,我就贴了一张图片,指针到了报警值就换图片。后来又告诉我说仪表盘是不一样的(内心orz:内心一万只cnm奔腾)好吧,废话不多说了,直入主题

    手把手教你玩转iOS的仪表盘

    最近公司项目需求,要求我做一个仪表盘,指针能工具报警值变换指针颜色的那种。而且仪表盘的量程,报警值都是不一样的(ps:仪表盘个数有点多,几十个的样子,而且每个都不一样)。刚开始的时候,万恶的美工告诉我说,每个仪表盘的度数、报警值是一样的,我就贴了一张图片,指针到了报警值就换图片。后来又告诉我说仪表盘是不一样的(内心orz:内心一万只cnm奔腾)

    好吧,废话不多说了,直入主题。

    我使用UIView的- (void)drawRect:(CGRect)rect方法画的,首先当然就是使用贝塞尔曲线描出两条路径,路径的颜色通过传参的方式传过来
    “` python
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetShadow(context, CGSizeMake(0, 0), 0);

    UIBezierPath *path = [UIBezierPath bezierPath];
    [path addArcWithCenter:CGPointMake(self.bounds.size.width/2, self.bounds.size.height/2) radius:76 startAngle:ANGLE_TO_RADIANS(150) endAngle:ANGLE_TO_RADIANS(390) clockwise:YES];
    UIColor *color  = self.leftColor;
    [color setStroke];
    path.lineWidth = 20;
    [path stroke];
    
    UIBezierPath *path2 = [UIBezierPath bezierPath];
    [path2 addArcWithCenter:CGPointMake(self.bounds.size.width/2, self.bounds.size.height/2) radius:76 startAngle:ANGLE_TO_RADIANS(150 + ((self.warningValue)/(self->maxValue - self->minValue))*240) endAngle:ANGLE_TO_RADIANS(390) clockwise:YES];
    UIColor *color2 = self.rightColor;
    [color2 setStroke];
    path2.lineWidth = 20;
    [path2 stroke];
    

    这些都是次要的,因为iOS开发的基本都会这个吧,那我还贴代码,我是不是多此一举。。。。。。

    其实最主要的当然就是画仪表盘的刻度了,这里有两个重要的方法
    CGContextTranslateCTM(context, center_.x, center_.y);
    CGContextRotateCTM(context, angle);
    第一个是移动函数,将图形上下文的原点在X轴和Y轴方向移动到某个位置,这里我要不要科普一下X轴和Y轴呢??感觉多次一举吧,因为平时开发中设置视图的frame的时候经常使用到呢,原点就是屏幕的左上角了,原点往右就是X轴正方向,原点往下就是Y轴正方向,原点朝正对我我们的方向就是Z轴的正方向了。是不是很脑残的解释哈。。。
    第二个是旋转函数,将图像上下文绕原点旋转angle度。画仪表的刻度就靠他了。
    CGFloat allAngle = 0.0;
    CGFloat cenx = CGRectGetMidX(self.bounds);
    CGFloat ceny = CGRectGetMidY(self.bounds);
    [self rotateContext:context fromCenter:CGPointMake(cenx, ceny) withAngle:ANGLE_TO_RADIANS(174+90)];
    for(int i = 0; i < (8+1); i++)
    {
    CGContextSetStrokeColorWithColor(context, [UIColor whiteColor].CGColor);
    CGContextSetLineWidth(context, 2.0);
    CGContextMoveToPoint(context, self.bounds.size.width/2, 0);
    CGContextAddLineToPoint(context, self.bounds.size.width/2, 20);
    CGContextStrokePath(context);
    [self rotateContext:context fromCenter:CGPointMake(cenx, ceny) withAngle:ANGLE_TO_RADIANS((276-84)/8)];
    }
    //旋转了角度,画完刻度需要将坐标旋转回初始状态
    allAngle = ANGLE_TO_RADIANS((276-84)/8)*(8+1);
    [self rotateContext:context fromCenter:CGPointMake(cenx, ceny) withAngle:-ANGLE_TO_RADIANS(150+24+90)];
    [self rotateContext:context fromCenter:CGPointMake(cenx, ceny) withAngle:-allAngle];

    • (void)rotateContext:(CGContextRef)context fromCenter:(CGPoint)center_ withAngle:(CGFloat)angle
      {
      CGContextTranslateCTM(context, center_.x, center_.y);
      CGContextRotateCTM(context, angle);
      CGContextTranslateCTM(context, -center_.x, -center_.y);
      }
      这样刻度就换好了,然后加一个指针就可以了,这里的指针就没有自己画了,直接贴了一张图,然后找准锚点和位置,再加一个定时器CADisplayLink,让定时器每次都转一刻度就哦了。这样就有人会有疑惑了,那么我想转快点咋办呢???如果每次转多点度数的话,那么必然导致转的不准啊。。。。。。这还不好解决吗?前面转的快点,当转的度数快到目标度数时,我又换成每次转一度,不就完美解决了。
      最后一个就是刻度的问题了,用我们的三角函数和半径,将一个数组填进去就好了。
      for (NSInteger i = 0; i < _numArray.count; i++) {
      static CGFloat r = 55;
      CGFloat x = 75 + r*cosf(ANGLE_TO_RADIANS(210-24*i));
      CGFloat y = 75 - r*sinf(ANGLE_TO_RADIANS(210-24*i));
      UILabel *numLabel = [[UILabel alloc]initWithFrame:CGRectMake(x, y, 40, 20)];
      numLabel.font = [UIFont systemFontOfSize:12];
      numLabel.textAlignment = NSTextAlignmentLeft;
      numLabel.text = [NSString stringWithFormat:@”%@”,_numArray[i]];
      [self addSubview:numLabel];
      }

    上传两张效果图
    这里写图片描述
    这里写图片描述

    展开全文
  • 手把手带你画一个 时尚仪表盘 Android 自定义View

    万次阅读 多人点赞 2016-01-06 15:29:16
    拿到美工效果图,咱们程序员就得画得一模一样。 为了不被老板喷,只能多练啊。 听说你觉得前面几篇都so easy,那今天就带你做个相对比较复杂的。 今天的效果图如下(左边是ui图 右边是实现图): 自我感觉总体效果还...


    拿到美工效果图,咱们程序员就得画得一模一样。 为了不被老板喷,只能多练啊。

    听说你觉得前面几篇都so easy,那今天就带你做个相对比较复杂的。


    转载请注明出处:http://blog.csdn.net/wingichoy/article/details/50468674

    注意:每一篇博客都是建立在之前博客的基础知识上的,如果你刚接触自定义view。可以来说说自定义view简单学习的方式这里看我以前的文章。记录了我学习自定义view的过程,而且前几篇博客或多或少犯了一些错误(重复绘制,onDraw里new对象等等)。这里我并不想改正博文中的错误,因为些错误是大家经常会犯的,后来的博客都有指出这些错误,以及不再犯,这是一个学习的过程。所以我想把错误的经历记录下来。等成为高手 回头看看当年的自己是多么菜。。也会有成就感。。

    今天的效果图如下(左边是ui图 右边是实现图):


    自我感觉总体效果还不错,至少大概画得一样了。上一个动态图:


    其实这个效果实现起来也不是很难,就是计算坐标,弧度之类的可能会比较麻烦,这里分享写这个其中一张手稿,请无视掉很丑的字,其实做自定义view 还是要在纸上多画。所以希望大家也能这么画画,思路会很顺。



    好的了,废话不多说,快开始。

    首先自定义属性  构造函数,测量什么的 你肯定已经很熟练 直接贴代码了,注释写的很清楚

    public class PanelView extends View {
        private int mWidth;
        private int mHeight;
    
        private int mPercent;
    
        //刻度宽度
        private float mTikeWidth;
    
        //第二个弧的宽度
        private int mScendArcWidth;
    
        //最小圆的半径
        private int mMinCircleRadius;
    
        //文字矩形的宽
        private int mRectWidth;
    
        //文字矩形的高
        private int mRectHeight;
    
    
        //文字内容
        private String mText = "";
    
        //文字的大小
        private int mTextSize;
    
        //设置文字颜色
        private int mTextColor;
        private int mArcColor;
    
        //小圆和指针颜色
        private int mMinCircleColor;
    
        //刻度的个数
        private int mTikeCount;
    
        private Context mContext;
    
        public PanelView(Context context) {
            this(context, null);
        }
    
        public PanelView(Context context, AttributeSet attrs) {
            this(context, attrs, 0);
        }
    
        public PanelView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            mContext = context;
            TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.PanelView,defStyleAttr,0);
            mArcColor = a.getColor(R.styleable.PanelView_arcColor, Color.parseColor("#5FB1ED"));
            mMinCircleColor = a.getColor(R.styleable.PanelView_pointerColor,Color.parseColor("#C9DEEE"));
            mTikeCount = a.getInt(R.styleable.PanelView_tikeCount,12);
            mTextSize = a.getDimensionPixelSize(PxUtils.spToPx(R.styleable.PanelView_android_textSize,mContext),24);
            mText = a.getString(R.styleable.PanelView_android_text);
            mScendArcWidth = 50;
        }
    
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            int widthSize = MeasureSpec.getSize(widthMeasureSpec);
            int widthMode = MeasureSpec.getMode(widthMeasureSpec);
            int heightSize = MeasureSpec.getSize(heightMeasureSpec);
            int heightMode = MeasureSpec.getMode(heightMeasureSpec);
            if (widthMode == MeasureSpec.EXACTLY) {
                mWidth = widthSize;
            }else {
                mWidth = PxUtils.dpToPx(200,mContext);
            }
    
    
            if (heightMode == MeasureSpec.EXACTLY) {
                mHeight = heightSize;
            }else {
                mHeight = PxUtils.dpToPx(200,mContext);
            }
            Log.e("wing",mWidth+"");
            setMeasuredDimension(mWidth, mHeight);
        }
    自定义属性attr.xml

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <declare-styleable name="PanelView">
            <attr name="arcColor" format="color"/>
            <attr name="arcWidth" format="dimension"/>
            <attr name="android:text"/>
            <attr name="tikeCount" format="integer"/>
            <attr name="pointerColor" format="color"/>
            <attr name="android:textSize"/>
        </declare-styleable>
    </resources>
    



    之后来重头戏,也就是绘制。就像画画一样,再复杂的view也是一笔一笔画出来的。所以我们把这个view分解。

    大概分解成如下:1.最外面的弧   2.里面的粗弧   3.中间小圆   4.最小的圆  5.刻度   6.指针  7.矩形  8.文字

    相信让你分开画一定难不倒你。那组合在一起 就是这个view啦。下面开始我们的ondraw()


    按照这个分解来:

    1.绘制最外面的弧   这里需要注意的一点是,如果想让这个圆在view里 记得减去画笔宽度的一半  因为半径是从圆心到画笔宽度的中间算的,所以这里画弧的矩形是  new RectF(strokeWidth, strokeWidth, mWidth - strokeWidth, mHeight - strokeWidth)

         Paint p = new Paint(); 
            int strokeWidth = 3;
            p.setStrokeWidth(strokeWidth);
            p.setAntiAlias(true);
            p.setStyle(Paint.Style.STROKE);
            p.setColor(mArcColor);
            //最外面线条
            canvas.drawArc(new RectF(strokeWidth, strokeWidth, mWidth - strokeWidth, mHeight - strokeWidth), 145, 250, false, p);
    

    画出来是这样的效果。



    2.绘制里面的粗弧,这里比较麻烦的就是需要分为四段,看图:


    因为大圆和里面粗弧的长短不一致,这里使用百分比来计算 所以会造成指针偏差,那么这里把 1、2两个部分固定来画,然后是3 充满的部分,用百分比来计算需要画多少度,最后是4 空白的部分。

    首先把粗弧的矩形画出来,这里固定了比大弧半径少50(这里其实可以改进,你可以改成动态的让他更灵活),然后计算出百分比。

    RectF secondRectF = new RectF(strokeWidth + 50, strokeWidth + 50, mWidth - strokeWidth - 50, mHeight - strokeWidth - 50);
            float secondRectWidth = mWidth - strokeWidth - 50 - (strokeWidth + 50);
            float secondRectHeight = mHeight - strokeWidth - 50 - (strokeWidth + 50);
            float percent = mPercent / 100f;

    接下来绘制1弧,先算出fill充满部分的度数,因为是突出的,所以如果百分比为0,突出左端为白色 如果不为零,则和充满颜色统一。

            //充满的圆弧的度数    -5是大小弧的偏差
            float fill = 250 * percent ;
    
            //空的圆弧的度数
            float empty = 250 - fill;
    //        Log.e("wing", fill + "");
    
            if(percent==0){
                p.setColor(Color.WHITE);
            }
            //画粗弧突出部分左端
    
            canvas.drawArc(secondRectF,135,11,false,p);

    然后绘制2弧 也就是fill充满的弧,

    canvas.drawArc(secondRectF, 145, fill, false, p);

    接下来是3弧,也就是empty未充满的弧,是白色的

     p.setColor(Color.WHITE);
            //画弧胡的未充满部分
            canvas.drawArc(secondRectF, 145 + fill, empty, false, p);

    最后,画出右边突出的4弧, 如果百分比为100 那么和充满的颜色一致,否则为白色

     //画粗弧突出部分右端
            if(percent == 1){
                p.setColor(mArcColor);
            }
            canvas.drawArc(secondRectF,144+fill+empty,10,false,p);

    这样粗弧也就画完了 来看看效果,就画了两条弧线(实际是5条),就成型了。



    3.中间的小圆外圈,他的圆心不用多说 是整个view的中心

            p.setColor(mArcColor);
    
    
            //绘制小圆外圈
            p.setStrokeWidth(3);
            canvas.drawCircle(mWidth / 2, mHeight / 2, 30, p);

    4.绘制内圆,圆心一样的,半径和画笔粗度改变一下

            //绘制小圆内圈
    
            p.setColor(mMinCircleColor);
            p.setStrokeWidth(8);
            mMinCircleRadius = 15;
            canvas.drawCircle(mWidth / 2, mHeight / 2, mMinCircleRadius, p);
    


    5.刻度  刻度处理起来可能比较麻烦,用三角函数算坐标啊 循环画出来。。 这里提供一种比较简单的方法:旋转画布。

    首先引入一个概念,什么叫旋转画布呢,就是把你的画布旋转。。经过测试,旋转以后,整个坐标轴都会对应旋转,一张图举例说明下。


    大概就是这个意思,画布旋转之后 坐标系也就旋转了,但是原来的图像还在,所以说你比如这个点 x,y旋转前在这个位置, 那么旋转后就是另外一个位置了,但是他们的坐标是相同的。 所以刻度也可以考这种方法画。我们只要画出最顶端的刻度 然后旋转就可以了。


    绘制第一段刻度, 然后总共是250的弧度  计算出每个刻度的度数     用250除以刻度数mTikeCount,就是每次旋转的度数。接下来把画布逐步旋转,按照原坐标绘制,即可绘制出右半部分刻度。  注意:为了让之后的绘制正常,务必把画布转回原来的位置

            //绘制刻度!
    
            p.setColor(mArcColor);
            //绘制第一条最上面的刻度
            mTikeWidth = 20;
            p.setStrokeWidth(3);
    
            canvas.drawLine(mWidth / 2, 0, mWidth / 2, mTikeWidth, p);
            //旋转的角度
            float rAngle = 250f / mTikeCount;
            //通过旋转画布 绘制右面的刻度
            for (int i = 0; i < mTikeCount / 2; i++) {
                canvas.rotate(rAngle, mWidth / 2, mHeight / 2);
                canvas.drawLine(mWidth / 2, 0, mWidth / 2, mTikeWidth, p);
            }
    
            //现在需要将将画布旋转回来
            canvas.rotate(-rAngle * mTikeCount / 2, mWidth / 2, mHeight / 2);


    左半部分同理,需要改变的度数为负 就好了

            //通过旋转画布 绘制左面的刻度
            for (int i = 0; i < mTikeCount / 2; i++) {
                canvas.rotate(-rAngle, mWidth / 2, mHeight / 2);
                canvas.drawLine(mWidth / 2, 0, mWidth / 2, mTikeWidth, p);
            }
    
    
            //现在需要将将画布旋转回来
            canvas.rotate(rAngle * mTikeCount / 2, mWidth / 2, mHeight / 2);
    


    6.指针   指针的绘制和刻度相似,先算出来百分比所占的度数 然后根据 是否大于50%来旋转画布。

    指针的起终点是 总view高度的一半 粗弧矩形的一半 加上小圆,前面坐标讲解了那么,这个也一样,自己拿起笔算一算。


    注意这里画布旋转我通过计算得出一个公式 250 * percent - 250/2。

    如果小于50% 则为负   如果大于50%则为正,然后进行旋转。

    切忌最后一定要将画布转回来。

            //绘制指针
    
            p.setColor(mMinCircleColor);
            p.setStrokeWidth(4);
    
    
    
            //按照百分比绘制刻度
            canvas.rotate(( 250 * percent - 250/2), mWidth / 2, mHeight / 2);
    
            canvas.drawLine(mWidth / 2, (mHeight / 2 - secondRectHeight / 2) + mScendArcWidth / 2 + 2, mWidth / 2, mHeight / 2 - mMinCircleRadius, p);
    
            //将画布旋转回来
            canvas.rotate(-( 250 * percent - 250/2), mWidth / 2, mHeight / 2);
    


    接下来就是画矩形和文字。没什么好说的了,坐标也是X周围mWidth/2   y轴自己根据圆心微调一个距离

        //绘制矩形
            p.setStyle(Paint.Style.FILL);
            p.setColor(mArcColor);
            mRectWidth = 60;
            mRectHeight = 25;
    
            //文字矩形的最底部坐标
            float rectBottomY = mHeight/2 + secondRectHeight/3+mRectHeight;
            canvas.drawRect(mWidth/2-mRectWidth/2,mHeight/2 + secondRectHeight/3,mWidth/2+mRectWidth/2,rectBottomY,p);
    
    
            p.setTextSize(mTextSize);
            mTextColor = Color.WHITE;
            p.setColor(mTextColor);
            float txtLength = p.measureText(mText);
            canvas.drawText(mText,(mWidth-txtLength)/2,rectBottomY + 40,p);
    
            super.onDraw(canvas);


    这样完成了整个view的绘制。


    下面要做的就是为了方便使用者,提供一些设置属性的方法。

     /**
         * 设置百分比
         * @param percent
         */
        public void setPercent(int percent) {
            mPercent = percent;
            invalidate();
        }
    
        /**
         * 设置文字
         * @param text
         */
        public void setText(String text){
            mText = text;
            invalidate();
        }
    
        /**
         * 设置圆弧颜色
         * @param color
         */
    
        public void setArcColor(int color){
            mArcColor = color;
    
            invalidate();
        }
    
    
        /**
         * 设置指针颜色
         * @param color
         */
        public void setPointerColor(int color){
            mMinCircleColor = color;
    
            invalidate();
        }
    
        /**
         * 设置文字大小
         * @param size
         */
        public void setTextSize(int size){
            mTextSize = size;
    
            invalidate();
        }
    
        /**
         * 设置粗弧的宽度
         * @param width
         */
        public void setArcWidth(int width){
            mScendArcWidth = width;
    
            invalidate();
        }


    大功告成!!!一个看似复杂的view  经过我们一步一步绘制遍完成了。

    其实技术的养成也是这样,只要一步一步脚踏实地的去练习,我相信总有一天我能成为大神。


    本项目地址 :PanelView   求关注  求评论  求star!!!!!!

    展开全文
  • 仪表盘在很多汽车和物联网相关的系统中很常用,最直观的其实就是汽车仪表盘,这个以前主要是机械的仪表,现在逐步改成了智能的带屏带操作系统的仪表,这样美观性和拓展性功能性大大增强了,上了操作系统的话,除了...
  • Qt编写自定义控件1-汽车仪表盘

    千次阅读 2019-04-19 20:51:44
    汽车仪表盘机会是qt写仪表盘控件中最常见的,一般来说先要求美工最好设计图,然后设计效果图给到程序员,由程序员根据效果来实现,主要靠贴图,这种方法有个好处就是做出来的效果比较逼真,和真实效果图基本上保持...
  • Android 仪表盘动画

    千次阅读 2017-02-12 21:23:39
    思路:没错,我们用自定义View可以做,不过比较...换个思路,我们让美工提供一张背景图和一张橙色指针图(这里要注意了,一定要提供多种分辨率的图片,为适配不同分辨率的手机),给橙色指针一个旋转动画不就可以了吗。
  • 界面美工,主要取决于美工的美图能力,缺点是对于各种分辨率的适应性稍微差点,需要不同的图片切图贴图,除非默认做好的是大图自适应看不出差别,可能大部分人所在的公司都是小公司,一般美工人员比较少甚至...
  • 界面美工,主要取决于美工的美图能力,缺点是对于各种分辨率的适应性稍微差点,需要不同的图片切图贴图,除非默认做好的是大图自适应看不出差别,可能大部分人所在的公司都是小公司,一般美工人员比较少甚至没有,.....
  • Qt编写云台仪表盘控件

    千次阅读 2018-09-04 22:47:02
    界面美工,主要取决于美工的美图能力,缺点是对于各种分辨率的适应性稍微差点,需要不同的图片切图贴图,除非默认做好的是大图自适应看不出差别,可能大部分人所在的公司都是小公司,一般美工人员比较少甚至没有,.....
  • 新的任务又来了,这次需要实现一个仪表盘的自定义控件,自定义控件一不常写就手生,这次又巩固下,并且学了一些新知识。https://developer.android.com/training/custom-views/index.html Android官方文档中关于...
  • 自动布局,任意切换主题颜色,无须专业美工也可轻松驾驭…迈安数据应用开发平台每一项细节功能的优化,都在重新定义敏捷BI。 迈安数据应用开发平台具有强大交互功能,全面升级数据可视化。颜色预警、高亮联动、图标...
  • 作品介绍 作品简介: 酷炫汽车仪表盘,硬件环境:800x480柿饼派 功能如下: 1、模拟汽车仪表盘 使用按键模拟汽车的前进后退、左右转向以及加油 2、通话记录: 模拟电话通信记录,区分拨入、拨出 3、WiFi网络列表: ...
  • 拿到美工效果图。咱们程序猿就得画得一模一样。 为了不被老板喷,仅仅能多练啊。 听说你认为前面几篇都so easy,那今天就带你做个相对照较复杂的。 转载请注明出处:...
  • 但是在使用过程中,也遇见了一些棘手的问题,下面和大家分享一下关于仪表盘变色的问题。   官方的OP: option = { tooltip : { formatter: "{a} &lt;br/&gt;{b} : {c}%" }, ...
  • 一款有意思的 Qt 飞行仪表控件

    万次阅读 热门讨论 2017-12-15 22:48:43
    最近在网上偶然发现一款Qt飞行仪表板控件,真的很酷哦! 是一款开源软件,地址 https://sourceforge.net/projects/qfi/, 直接编译运行: 美工还是不错的! 控件操作非常简单: void MainWindow::timerEvent...
  • 轮播夜光仪表盘   FineReport大屏插件有很多,小编在这里列举几个,想要下载插件话可以在这里找到:服务器>插件管理>安装/更新扩展图表3.0   5.添砖加瓦,细节雕琢 上一步我们把大致的框架搭...
  • 今天项目中有一个显示钟表功能模块,美工比较懒说表盘比较简单可以自己画一个。于是我就回想起当初制作过一个自定义表盘可以直接CP过来用的。哈哈哈哈~鉴此必须记录下这CP大法的时刻,先上一个比较粗糙的效果图: ...

空空如也

空空如也

1 2 3 4 5 ... 13
收藏数 251
精华内容 100
关键字:

仪表盘美工