自定义汽车仪表盘

2 篇文章 0 订阅
订阅专栏

自定义汽车仪表盘

效果图:

这里写图片描述

获取控件的宽高
 @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);

        mWidth = w;
        mHeight = h;
        mCenterX = mWidth / 2f;
        mCenterY = mHeight / 2f;
        mRadius = (mHeight - offset * 2) / 2;
    }
初始化画笔:
//最外层大圆弧的画笔
        outerArcPaint = new Paint();
        outerArcPaint.setStyle(Paint.Style.STROKE);
        outerArcPaint.setStrokeWidth(mStrokeWidth);
        outerArcPaint.setColor(Color.parseColor("#5555aa"));
        outerArcPaint.setAntiAlias(true);//防止边缘锯齿

        //最外层小圆弧的画笔
        outerSmallArcPaint = new Paint();
        outerSmallArcPaint.setAntiAlias(true);//防止边缘锯齿
        outerSmallArcPaint.setStyle(Paint.Style.STROKE);
        outerSmallArcPaint.setStrokeCap(Paint.Cap.ROUND);//设置线冒样式,取值有Cap.ROUND(圆形线冒)、Cap.SQUARE(方形线冒)、Paint.Cap.BUTT(无线冒)
        outerSmallArcPaint.setStrokeWidth(dp2px(3));
        SweepGradient sweepGradient = new SweepGradient(mCenterX, mCenterY, mColors, null);
        outerSmallArcPaint.setShader(sweepGradient);//填充颜色


        //内部圆的画笔
        insideCirclePaint = new Paint();
        insideCirclePaint.setColor(Color.parseColor("#27408B"));
        insideCirclePaint.setStyle(Paint.Style.FILL);
        insideCirclePaint.setAntiAlias(true);//防止边缘锯齿

        //绘制速度值的画笔
        speedPaint = new Paint();
        speedPaint.setColor(Color.parseColor("#ff0000"));
        speedPaint.setAntiAlias(true);//防止边缘锯齿
        speedPaint.setStrokeWidth(4);

        //刻度线的画笔
        scaleLinePaint = new Paint();
        scaleLinePaint.setStrokeWidth(4);
        scaleLinePaint.setAntiAlias(true);//防止边缘锯齿
        scaleLinePaint.setColor(Color.parseColor("#ECEFF1"));

        //刻度数字的画笔
        scaleTextPaint = new Paint();
        scaleTextPaint.setTextSize(sp2px(16));
        scaleTextPaint.setTypeface(Typeface.DEFAULT);
        scaleTextPaint.setColor(Color.parseColor("#ECEFF1"));
        scaleTextPaint.setAntiAlias(true);//防止边缘锯齿
        mRectText = new Rect();

        //绘制单位km/h的画笔
        unitTextPaint = new Paint();
        unitTextPaint.setColor(Color.parseColor("#ECEFF1"));
        unitTextPaint.setAntiAlias(true);//防止边缘锯齿
        unitTextPaint.setTypeface(Typeface.DEFAULT);
        unitTextPaint.setTextSize(sp2px(16));
        unitTextPaint.setTextAlign(Paint.Align.CENTER);

        //指针的画笔
        pointerPaint = new Paint();
        pointerPaint.setStrokeCap(Paint.Cap.ROUND);//设置线的两端为圆弧
        pointerPaint.setColor(Color.parseColor("#55aaaa"));
        pointerPaint.setStrokeWidth(dp2px(3));
画圆弧
private void drawArc(Canvas canvas) {

        //画外部大圆弧
        RectF mRectFArc = new RectF((mWidth - mHeight) / 2 + offset, offset, mWidth - (mWidth - mHeight) / 2 - offset, mHeight - offset);
        canvas.drawArc(mRectFArc, mStartAngle - 15, mSweepAngle + 30, false, outerArcPaint);

        //画外部小圆弧
        RectF mSmallRectFArc = new RectF((mWidth - mHeight) / 2 + offset + mLength1, offset + mLength1, mWidth - (mWidth - mHeight) / 2 - offset - mLength1, mHeight - offset - mLength1);
        canvas.drawArc(mSmallRectFArc, mStartAngle - 15 + mSweepAngle + 30 - 360, 360 - (mSweepAngle + 30), false, outerSmallArcPaint);

        //画内部中心圆
        canvas.drawCircle(mCenterX, mCenterY, mRadius / 2, insideCirclePaint);

    }
绘制文本
private void drawText(Canvas canvas) {

        //绘制速度值
        int xOffset = dp2px(22);
        if (mVelocity >= 100) {
            drawDigitalTube(canvas, mVelocity / 100, -xOffset);
            drawDigitalTube(canvas, (mVelocity - 100) / 10, 0);
            drawDigitalTube(canvas, mVelocity % 100 % 10, xOffset);
        } else if (mVelocity >= 10) {
            drawDigitalTube(canvas, -1, -xOffset);
            drawDigitalTube(canvas, mVelocity / 10, 0);
            drawDigitalTube(canvas, mVelocity % 10, xOffset);
        } else {
            drawDigitalTube(canvas, -1, -xOffset);
            drawDigitalTube(canvas, -1, 0);
            drawDigitalTube(canvas, mVelocity, xOffset);
        }

        //绘制单位km/h
        canvas.drawText(mHeaderText, mWidth / 2, mHeight / 2 + unitTextPaint.getTextSize() + offset, unitTextPaint);

    }
画刻度
private void drawScale(Canvas canvas) {

        /**
         * 画长刻度
         * 画好起始角度的一条刻度后通过canvas绕着原点旋转来画剩下的长刻度
         */
        double cos = Math.cos(Math.toRadians(mStartAngle - 180));
        double sin = Math.sin(Math.toRadians(mStartAngle - 180));
        int xOff = (mWidth - mHeight) / 2 + offset + mStrokeWidth / 2;
        int yOff = offset - mStrokeWidth / 2;

        float x0 = (float) (xOff + mRadius * (1 - cos));
        float y0 = (float) (yOff + mRadius * (1 - sin));
        float x1 = (float) (xOff + mRadius - (mRadius - mLength1) * cos);
        float y1 = (float) (yOff + mRadius - (mRadius - mLength1) * sin);

        canvas.save();
        canvas.drawLine(x0, y0, x1, y1, scaleLinePaint);
        float angle = mSweepAngle * 1f / mSection;
        for (int i = 0; i < mSection; i++) {
            canvas.rotate(angle, mCenterX, mCenterY);
            canvas.drawLine(x0, y0, x1, y1, scaleLinePaint);
        }
        canvas.restore();


        //画刻度读数
        float α;
        float[] p;
        angle = mSweepAngle * 1f / mSection;
        for (int i = 0; i <= mSection; i++) {
            α = mStartAngle + angle * i;
            p = getCoordinatePoint(mRadius - mLength2, α);
            if (α % 360 > 135 && α % 360 < 225) {
                scaleTextPaint.setTextAlign(Paint.Align.LEFT);
            } else if ((α % 360 >= 0 && α % 360 < 45) || (α % 360 > 315 && α % 360 <= 360)) {
                scaleTextPaint.setTextAlign(Paint.Align.RIGHT);
            } else {
                scaleTextPaint.setTextAlign(Paint.Align.CENTER);
            }
            scaleTextPaint.getTextBounds(mHeaderText, 0, mTexts[i].length(), mRectText);
            int txtH = mRectText.height();
            if (i <= 1 || i >= mSection - 1) {
                canvas.drawText(mTexts[i], p[0], p[1] + txtH / 2, scaleTextPaint);
            } else if (i == 3) {
                canvas.drawText(mTexts[i], p[0] + txtH / 2, p[1] + txtH, scaleTextPaint);
            } else if (i == mSection - 3) {
                canvas.drawText(mTexts[i], p[0] - txtH / 2, p[1] + txtH, scaleTextPaint);
            } else {
                canvas.drawText(mTexts[i], p[0], p[1] + txtH, scaleTextPaint);
            }
        }
    }
画指针
private void drawPointer(Canvas canvas) {
        float θ = mStartAngle + mSweepAngle * (mVelocity - mMin) / (mMax - mMin); // 指针与水平线夹角
        float[] p1 = getCoordinatePoint(mRadius - mStrokeWidth, θ);
        float[] p2 = getCoordinatePoint(mRadius / 10 * 6, θ);
        canvas.drawLine(p1[0], p1[1], p2[0], p2[1], pointerPaint);
    }
下载地址:

源码下载

自定义小车模型
03-26
ROS kinetic 下urdf格式的自定义的小车模型,可在gazebo中显示
自定义汽车仪表盘样式
鸿鹄的博客
08-08 658
文章目录view 代码布局文件中使用主activity中调运 view 代码 package qzl.com.wangjun.view; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; impo...
自定义一个汽车时速表DashbordView
vip_song的博客
11-05 1499
先上个效果图看下,按住加速按钮不放,实现指针移动,并显示当前的数值 松开手指,暂停加速。     思路: 1.画个圆弧 2.画100个小刻度 3.画20个5分隔的中间刻度 4.画10个小刻度 5.画指针 6.画刻度文字,当前刻度文字 7.实现动态指针变换   开始coding吧。 1.画圆弧 canvas提供的画弧形方法。 确定一个矩形的区域,初始角度,扫过...
仪表盘参考 shader
lynon的专栏
01-26 301
转载自: http://glslsandbox.com/e#44347.0 #ifdef GL_ES precision mediump float; #endif #extension GL_OES_standard_derivatives : enable # define PI (4. * atan(1.)) # define PI2 (P
Qt自定义汽车仪表盘控件
10-28
【Qt自定义汽车仪表盘控件】是一种在Qt框架下实现的GUI部件,它通过Qt的绘图功能,特别是`QPainter`类,来创建出美观的、具有真实感的汽车仪表盘界面。Qt是一个跨平台的应用程序开发框架,广泛用于桌面、移动和...
Android自定义汽车仪表
06-21
本话题聚焦于"Android自定义汽车仪表",这通常涉及到创建一个模仿真实汽车仪表盘的用户界面,包括速度表、转速表、油量指示器等元素。在Android应用中实现这样的功能,开发者需要深入理解Android图形绘制、动画和...
c# Winform自定义控件-仪表盘功能
08-25
仪表盘控件可以应用于各种场景,例如工业控制系统、医疗设备、汽车电子设备等。 9. 自定义控件的优点和缺点 自定义控件的优点是可以满足特殊的需求,提供灵活的设计和实现方式。但是,自定义控件也存在一些缺点,...
Android自定义控件 仪表盘
用技术改变世界
04-20 1009
Android 自定义View 汽车仪表盘 先上图 步骤: 一、自定义DashBoard 继承View,布局文件全类目写自定义view 二、画大弧 三、画刻度 四、画指针 详解: 一、 public class DashBoard extends View` 布局文件 <myview.DashBoard android:id="@+id/dashview" ...
Qt自定义控件--仪表盘源码
08-17
仪表盘控件通常用于显示数值或状态信息,如速度、温度、压力等,其设计灵感可能来源于汽车或飞机上的仪表。 描述中提到,源码可以使用Qt4.8.6和Qt5.7.1进行编译,这表明该代码兼容这两个版本的Qt。Qt5是一个重要的...
Qt汽车仪表界面
03-18
Qt 写的一个模拟汽车仪表盘的小demo
android自定义速度仪表盘,自定义View实战:汽车速度仪表盘
weixin_31759829的博客
05-25 1207
是不是很酷炫?看起来觉得有点复杂? 其实不难 , 实现起来很容易。绘制逻辑如下:1. 绘制一个实心的圆做仪表盘背景:mPaint.setStyle(Paint.Style.FILL);mPaint.setColor(0xFF343434);canvas.drawCircle(pointX, pointY, raduis, mPaint);2. 绘制外面的两个圆环 和 里面的 两个圆环://外圈...
View系列 : View项目:汽车仪表盘,圆盘
C++ JAVA的专栏
03-28 3640
1:汽车仪表盘 2 :效果分解 汽车 仪表盘
Qt汽车自定义仪表盘控件
程序员黄老师的精品课!
07-05 785
自己实现了一个Qt汽车仪表控件,先看效果,后上源码!
汽车仪表盘的开发。
淡看人生
06-24 6516
效果图: 注:能够适配各种分辨率。 文笔不行,就不加说明了。 直接上源码,导入eclipse中可以运行。
手动实现一个速度仪表盘
weixin_34362875的博客
02-17 515
前言 最近正在学习数据可视化, 这里记录一下一些心得与成果, 采用的技术是 (svg + react + d3)。 这种实现可视化方式本人个人感觉超级不错,如果你是有一定的基础的同学,强烈推荐一下。 效果 整体效果如下: 这个是普通的速度仪表盘,有没有开发太多的动态交互,唯一的交互是点击图片最上面的加速与减速就能够调整速度了。 开发思路...
Qt Qwdget 汽车仪表知识点拆解6 自定义控件
DreamLife
01-06 2665
先贴上效果图,注意,没有写逻辑,都是乱动的 这里说一下控件自定义 图中标出的部分都是自定义的控件 这里如果我们有批量类似的功能,就可以使用自定义控件的方式,这里我已下面的自定义控件说一下,上面的在上一篇文章中已经有了代码了 选着项目,鼠标邮件,添加新文件 选择C++类,再选择C++ class 完了点击Choose就可以了 填写自己的类的名称,
Unity3D之仪表盘仪表
逆袭的博客
08-01 3533
两种方式:     void RotateFunction()     {         go.transform.Rotate(new Vector3(0, 0, -(slider.value - lateValue)));         lateValue = slider.value;     }     void RotationFunction()     {
Qt Qml 汽车仪表
DreamLife
01-03 4845
上一个原文连接http://blog.csdn.net/z609932088/article/details/53946245 唯一的问题就是在绘制仪表指针的时候有锯齿 换成qml可以消除锯齿,但是我对qml不熟练啊,(┬_┬) 这里摸索出来一个间的界面,就是在aml加一个定时器,来改变角度 上源代码 import QtQuick 2.7 impor
C#开发自定义样式仪表盘显示组件
2. 仪器仪表盘:在工业控制、科学测量、汽车等领域,仪表盘是必不可少的组件,它负责显示各种仪器和机器的状态信息。一个良好的仪表盘设计能够让操作者快速获取关键数据,提高工作效率和安全性。 3. 数据显示组件:...
写文章

热门文章

  • Android SwitchCompat开关按钮自定义颜色和样式 7332
  • 自定义汽车仪表盘 800
  • 自定义折线图 251

分类专栏

  • android 1篇
  • 自定义view 2篇

最新评论

  • 自定义汽车仪表盘

    m0_46377012: import android.support.v7.app.AppCompatActivity;怎么报错了

  • Android SwitchCompat开关按钮自定义颜色和样式

    脱贫致富un: 学习了

最新文章

  • 自定义折线图
  • Android SwitchCompat开关按钮自定义颜色和样式
2017年3篇

目录

目录

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

玻璃钢生产厂家陕西高质量玻璃钢雕塑设计盐城室内玻璃钢花盆晋城玻璃钢雕塑厂家费用德阳玻璃钢雕塑摆件施工厂家玻璃钢雕塑新闻重庆泡沫玻璃钢雕塑济南工业玻璃钢雕塑摆件玻璃钢小雕塑制作工艺通州玻璃钢雕塑企业河北商业商场美陈生产厂家花盆玻璃钢花盆图片外贸玻璃钢花盆厂家怒江商场美陈雕塑厂家韶山玻璃钢人物运动雕塑玻璃钢人像雕塑联系方式广东商场创意商业美陈多少钱淮安玻璃钢人物雕塑商家天津大型商场创意商业美陈金昌公园玻璃钢雕塑厂家陵水黎族自治县玻璃钢雕塑厂家山东人物玻璃钢雕塑生产厂家景观玻璃钢雕塑专业商场美陈制作哪家好浙江玻璃钢酒店人物雕塑商场美陈制造福建园林玻璃钢雕塑采购成都双流做玻璃钢雕塑厂株洲玻璃钢果蔬雕塑内蒙古广场玻璃钢雕塑定做泡沫玻璃钢雕塑设计公司香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化