android自定义view学习(一)之时尚表盘

手把手带你画一个 时尚仪表盘 Android 自定义View 拿到美工效果图,咱们程序员就得画得一模一样。 为了不被老板喷,只能多练啊。 听说你觉得前面几篇都so easy,那今天就带你做个相对比较复杂的。 今天的效果图如下(左边是ui图 右边是实现图): 自我感觉总体效果还不错,至少大概画得一样了。上一个动态图: 其实这个效果实现起来也不是很难,就是计算坐标,弧度之类的可能会比较麻烦,这里分享写这个其中一张手稿,请无视掉很丑的字,其 阅读详情

最近在学习自定义view,顺便谢谢自己的路程,后面回首看看以前的自己有多菜。。。。下方的是实现图,首先需要说明的是,这个效果是看了一遍博客,然后自己想着去实现,并给出此博客:点击打开链接


正文:首先学习自定义view需要稍稍入门一下,然后是各种函数的使用,以及大量的练习,至于入门的话,推荐鸿阳大神的博客,讲的非常详细:点击打开链接,然后自己的自定义view学习之路暂时跟着一篇博客走,有兴趣的朋友可以一起:点击打开链接

接下来进入我的实现过程了:(发现错误了,但是并不修正此博客, 算是记录错误:onDraw这个方法,刷新界面就会执行,因此不要去new对象,不然会导致浪费大量的资源,关于path,因为不能重复的new,所以每次对path进行一下reset就好)

首先分析组成:一个粗圆,一个细圆,一个粗圆弧,一个细圆弧,一个进度线,几个刻度线

为了简便,此处不使用自定义属性

按照流程走:先测量一下宽高

if (MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.EXACTLY) {
    mWidth = MeasureSpec.getSize(widthMeasureSpec);
}
if (MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.EXACTLY) {
    mHeight = MeasureSpec.getSize(heightMeasureSpec);
}
setMeasuredDimension(widthMeasureSpec, heightMeasureSpec);

因为自己学习过程中,先没有去弄wrap_content的布局,直接给的固定宽高,当然用wrap_content的时候,测量模式为ATMOST,只需要再处理一下即可

接着定义了一些成员变量

private int mHeight;
private int mWidth;
private Paint mPaint;
//正方形边长
private int rectWidth = 400;
//开始角度
private int startAngle = 135;
//扫过角度
private int endAngle = 270;
//外弧形边距
private int outsidePadding = 50;
//每一个线相距角度
private int everyArc = 30;
//圆心的x值与y值
private int centerArcX;
private int centerArcY;
//最内心圆圈直径
private int insideRadius = 15;
//中间圆的直径
private int insideTwoRadius = 30;
//大圆弧和最外层圆弧相距的距离
private int twoArcPadding = 60;
//大圆弧的粗度
private int bigArcWidth = 40;
//百分比进度
private float haveDownProgress = 0;
//一共画几次线
private float lineCount = 10;
//存储画线类的集合
private List<LineEntity> mLineEntities;

(自定义view的时候,疯狂注释是好习惯)

 这个时候就可以开始绘制了

先画一个最外层的弧形:

//绘制最外层弧形
mPaint.setColor(Color.WHITE);
mPaint.setStrokeWidth(4);
mPaint.setStyle(Paint.Style.STROKE);
RectF rectf = new RectF(outsidePadding, outsidePadding, outsidePadding + rectWidth, outsidePadding + rectWidth);
canvas.drawArc(rectf, startAngle+10, endAngle-20, false, mPaint);

确定好矩形位置与角度,直接调用函数绘制即可

然后画里面的两个圆:

//画最内的圆圈
mPaint.setColor(Color.WHITE);
mPaint.setStrokeWidth(8);
canvas.drawCircle(centerArcX, centerArcY, insideRadius, mPaint);
//画中间的园
mPaint.setStrokeWidth(2);
canvas.drawCircle(centerArcX, centerArcY, insideTwoRadius, mPaint);

接着画最粗的圆弧,因为是进度表盘,进度分为两个区域(原谅我懒得制作动态图),大概为下面这个样子:


此处采用的方式为绘制两个不同弧度的圆弧,差别在于弧度和颜色不同

//画大圆弧,分为蓝色与白色区域,用同一个Recf
RectF rectFTwo = new RectF(outsidePadding + twoArcPadding, outsidePadding + twoArcPadding,
        outsidePadding + rectWidth - twoArcPadding, outsidePadding + rectWidth - twoArcPadding);
//画一个蓝色区域
mPaint.setColor(Color.YELLOW);
mPaint.setStrokeWidth(bigArcWidth);
canvas.drawArc(rectFTwo, startAngle, 270 * haveDownProgress + 2, false, mPaint);
//画一个白色区域
mPaint.setColor(Color.WHITE);
canvas.drawArc(rectFTwo, 270 * haveDownProgress + 135 - 2, 270 * (1 - haveDownProgress), false, mPaint);

就是这样。嗯。。。。有点蠢 不过实现了

然后开始画进度线了,图上进度有线有10条,利用PathMeasure这个类可以获取到对应圆弧的x,y坐标点,这样画线就非常方便,不需要写算法去算坐标点了:

if (!(mLineEntities.size()>0)){
    //获取小圆弧的坐标点(画线有间隔,设置虚拟矩形)
    Path path = new Path();
    RectF rectFUse = new RectF(outsidePadding + twoArcPadding - 40, outsidePadding + twoArcPadding - 40,
            outsidePadding + rectWidth - twoArcPadding + 40, outsidePadding + rectWidth - twoArcPadding + 40);
    path.addArc(rectFUse, startAngle+10, endAngle-20);
    PathMeasure pathMeasure = new PathMeasure(path, false);
    for (int i = 0; i < lineCount; i++) {
        float[] coords = new float[]{0f, 0f};
        pathMeasure.getPosTan((i) * pathMeasure.getLength() / (lineCount - 1), coords, null);
        LineEntity lineEntity = new LineEntity();
        lineEntity.setEndX(coords[0]);
        lineEntity.setEndY(coords[1]);
        mLineEntities.add(lineEntity);
    }

    //获取大圆弧的坐标点
    Path pathTwo = new Path();
    pathTwo.addArc(rectf, startAngle+10, endAngle-20);
    PathMeasure pathMeasureTwo = new PathMeasure(pathTwo, false);
    for (int i = 0; i < lineCount; i++) {
        float[] coords = new float[]{0f, 0f};
        pathMeasureTwo.getPosTan((i) * pathMeasureTwo.getLength() / (lineCount - 1), coords, null);
        mLineEntities.get(i).setStartX(coords[0]);
        mLineEntities.get(i).setStartY(coords[1]);
    }
}

此处说明一下:mLineEntities这个类是我用来存储进度线的类集合,加size>0的目的是因为它是固定的,不需要重复获取,里面就是获取圆弧上点的坐标点位置,getPosTan()方法的意思是,将圆弧分为多少段,然后你想取的位置位于第几段,并且这个点的位置是跟着你画圆弧的方向走的,也就是顺时针第一个

然后开始画刻度线:

//开始画线
mPaint.setColor(Color.WHITE);
mPaint.setStrokeWidth(4);
for (LineEntity lineEntity : mLineEntities) {
    canvas.drawLine(lineEntity.getStartX(), lineEntity.getStartY(), lineEntity.getEndX(), lineEntity.getEndY(), mPaint);
}

大体都完事了,差一个指针,和绘制刻度线差不多

//画进度线
Path pathProgressSmall=new Path();
RectF rectFSmall=new RectF(centerArcX-insideRadius,centerArcY-insideRadius,centerArcX+insideRadius,centerArcY+insideRadius);
pathProgressSmall.addArc(rectFSmall, startAngle-2, endAngle+3);
PathMeasure pathMeasureSmall=new PathMeasure(pathProgressSmall,false);
float[] coordsSmall=new float[]{0f,0f};
pathMeasureSmall.getPosTan(haveDownProgress*pathMeasureSmall.getLength(),coordsSmall,null);

Path pathProgressBig=new Path();
RectF rectFBig=new RectF(outsidePadding + twoArcPadding+bigArcWidth/2, outsidePadding + twoArcPadding+bigArcWidth/2,
        outsidePadding + rectWidth - twoArcPadding-bigArcWidth/2, outsidePadding + rectWidth - twoArcPadding-bigArcWidth/2);
pathProgressBig.addArc(rectFBig, startAngle-2, endAngle+3);
PathMeasure pathMeasureBig=new PathMeasure(pathProgressBig,false);
float[] coordsBig=new float[]{0f,0f};
pathMeasureBig.getPosTan(haveDownProgress*pathMeasureBig.getLength(),coordsBig,null);

mPaint.setColor(Color.WHITE);
mPaint.setStrokeWidth(4);
canvas.drawLine(coordsSmall[0],coordsSmall[1],coordsBig[0],coordsBig[1],mPaint);

这样的话,自定义view已经完事了,对外提供一个方法,用于控制进度:

public void onRefresh(float progress) {
    haveDownProgress = progress;
    invalidate();
}

到此结束,开始研究自定义view不久,可能写的很多地方有问题,新手可以借鉴一下,大神请多多包涵,并指出不合理的地方!谢谢各位

另外插一句,之前放上去的博客,它使用的旋转画布的方式实现,性能应该更好,此处只是放出了自己的实现方式,并且利用PathMeasure获取坐标点算是不同处得亮点(嘿嘿)

Android 自定义View(一)实现时钟表盘效果 一、前言 Android 自定义View是高级进阶不可或缺的内容,日常工作中,经常会遇到产品、UI设计出花里胡哨的界面。当系统自带的控件不能满足开发需求时,就只能自己动手撸一个效果。 本文就带自定义View初学者手动撸一个效果,通过自定义View实现钟表功能,每行代码都有注释,保证易懂,看不懂你留言打我!!! 二、实现效果 先看效果图 步骤分析 实现以上效果,主要分为四个步骤: 绘制外层表盘 绘制刻度线 绘制刻度数字 绘制指针 三、代码实现 1、绘制外层表盘 外层表盘就是一个空心圆,只要获取圆的x、y 阅读详情

相关推荐

简单说说Android自定义view学习推荐的方式

这几天比较受关注,挺开心的,嘿嘿。 这里给大家总结一下学习自定义view的一些技巧。 1.首先 去看看鸿洋神的博客 Android 自定义view(1). 鸿洋神的入门教程讲的很详细。再次膜拜。 然后我这里对上面博客补充一些内容,那就是MeasureSpec相关的一些东西,这些东西我在《圆形百分比》这篇博客里提到过。 ----------------------------

旋转 跳跃 然后 团灭 1万+

Android自定义圆环进度条/刻度仪表盘(单环单点带动画)

Android自定义圆环进度条/刻度仪表盘(单环单点带动画)

jin_pan的博客 968

Android自定义View之DashBoard(仪表盘)

前言 Android自定义View是Android初中级开发工程师向高级工程师进阶所必须掌握的一块内容,其重要性不言而喻。接下来的一段时间,我会连续出几篇跟自定义View相关的文章,从易到难,跟大家一起学习Android自定义View。本文讲一个Android很简单的View——DashBoard(仪表盘),以这个例子带大家去学习自定义View的基本绘制,让大家学会自定义View,并最终掌握。 注...

weixin_43901866的博客 1326

Android 仿仪表盘进度自定义view

仿照仪表盘的自定义view,带有半圆进度,带有进度指针。直接贴代码拿过去直接用,里面需要修改的可以定义外部传参接口,然后传入数据刷新。整个进度的宽度,角度长度都是可以改变的,前面的圆球也是可以改变的。展示当前进度文字,和提示状态

weixin_43797914的博客 688

Android自定义view系列:手撸一个带点儿科技感的仪表盘!

本文只是运用一些自定义View的基础知识,大家如果没有兴趣跟着步骤一步一步来 如果你想对这部分知识进行下复习和梳理,也可以跟着步骤来看下,文中内容若有疏漏,还望不吝赐教。 效果图 分析 自定义View最主要的是梳理清楚绘制的逻辑。弄明白逻辑了,一步一步来,复杂的View也就没有那么复杂了。 绘制步骤整理如下: 绘制一个发光的弧形 绘制刻度和数字 绘制指针阴影 绘制中间黑色圆形背景 绘制表针...

Aerfa789的博客 1484

Android从零开始:我的自定义view学习过程

做android也有一段时间了,虽然基本都是在自学,不过自我感觉还是良好。。。 然而仅仅是“自我感觉”而已。前段时间发现自己对自定义view真是一窍不通啊! 以前基本都是用系统控件、开源控件什么的,从没有自定义过控件,虽然平时用自定义view的场合可能也不多, 但是通过学习自定义view可以帮助理解android view的绘制流程等问题,还是灰常值得学习的。 但是现在不会肿么办!

柱子的博客 3044

Android实现圆弧形渐变色进度条

效果图:我写的这篇博客个人感觉非常的不详细,这也是根据UI设计的,不过大家掌握下文所点出来的重点方法也可以将其绘制出来,这里就不详细介绍绘制流程了 UI分析:这个UI细分为表盘刻度、进度条底色、进度条渐变色、最外层那个实心圆球和文字描述。接下来就逐个实现一、绘制表盘刻度1、绘制表盘的刻度主要是用了画布的旋转来进行绘制 利用canvas.rotate()方法来旋转画布。利用canva.drawTe

ForrestL的博客 1万+

Android自定义View:打造时钟表盘

自定义View是Android开发中一项高级技能,它能够让你根据应用的特定需求设计独特的用户界面。开始创建自定义View之前,首先需要了解其基本步骤,包括继承现有的View类、重写构造函数、onDraw()方法,以及在合适的地方更新视图。每一步都至关重要,它们共同决定了自定义View的外观和行为。在Android系统中,绘图操作是通过View的方法进行的。Canvas是Android提供的一套绘图API,可以看作是一个绘图的画布,负责管理绘图的基本操作,如绘制线条、图形、文本、图片等。

weixin_34725745的博客 1163

Android 仪表进度条 自定义View

Android 自定义仪表进度条浅析继续玩一玩自定义View吧,这次加上了自定义属性,即,在xml中引用该控件可以通过自定义属性设置一些效果。该进度条实现了颜色渐变等,是出门旅行,熟悉自定义View之必备补品,可直接用于实际项目,已优化,比如下载东西展示个进度什么的,知识点掌握之后,你想怎么折腾就怎么折腾吧。 (Gradle Build)原创帖,转载请注明出处,开源思想,欢迎关注探讨Github:

尽际的博客 1490

Android自定义View实战:汽车速度仪表盘

在Android开发中,自定义View是提高用户界面灵活性和创新性的强大工具。掌握自定义View的实现,不仅能够帮助开发者创建独特的UI组件,还能深入理解Android图形绘制机制。自定义View是指开发者通过继承View类或其子类,根据需求定制的视图组件。这包括但不限于对布局、属性、绘制方法等进行扩展。自定义View能够实现标准控件所不能提供的功能,例如动态图表、特殊动画效果等。继承View类: 从一个已有的View类(如View、ViewGroup等)进行继承。重写构造函数。

weixin_42462474的博客 1122

超级实用仪表盘进度条

1、二次封装的自定义progressBar进度条控件;2、代码简洁易懂,有详细注释,实现原理非常简单,而且可以根据自己的需要实现扩展;3、UI界面很绚丽,酷似油量仪表板带图案和文字以及刻度;4、如果开发中有相关需求的话,不妨看一下。

Android仪表盘自定义

只有最基本的表盘跟指针没弄动画。 主要是onDraw方法 @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.translate(mWidth / 2, mHeight / 2);//移动坐标原点到中心 RectF rectF = new RectF(-mWi...

qq_32792163的博客 940

Android——Canvas切割出扇形表盘式进度

博客地址:http://www.cnblogs.com/ityizhainan/p/6306748.html

android 仪表界面,Android自定义View之DashBoard(仪表盘)

前言Android自定义View是Android初中级开发工程师向高级工程师进阶所必须掌握的一块内容,其重要性不言而喻。接下来的一段时间,我会连续出几篇跟自定义View相关的文章,从易到难,跟大家一起学习Android自定义View。本文讲一个Android很简单的View——DashBoard(仪表盘),以这个例子带大家去学习自定义View的基本绘制,让大家学会自定义View,并最终掌握。注:本...

weixin_40002846的博客 1002

android,仪表盘

使用强大的第三方控件,里面有折线图,柱形图,仪表盘,更中强大的控件,很容易使用

GNSS - PPP软件 - GAMP 在VS2019/2022下完成调试、跑通程序(超详细!)

WIN32;_DEBUG;_CONSOLE;O_WARNINGS;ENAGLO;ENACMP;ENAGAL;ENAQZS;NFREQ=3。

qq_43381998的博客 8251

Android自定义View之时钟

  效果(gif效果不是很好) GitHub地址 https://github.com/zuohp/My_Clock.git 绘制思路 1. 绘制表盘和长短刻度 2. 绘制各个时间点的数字 3. 绘制时针,分针,秒针 4. 让各个指针转起来,根据时间计算角度 开始绘制 1. 定义参数(attrs文件) &lt;declare-styleable name...

Hello__code的博客 3712

基于Python爬虫的新闻热点分析与挖掘

本文介绍了基于Python爬虫的新闻热点分析与挖掘方法,主要包括数据收集、预处理、热点分析和可视化四个部分。首先通过爬虫抓取新浪新闻数据,利用文本清洗和存储技术进行数据预处理;接着采用TF-IDF和LDA算法进行关键词提取与主题建模;最后通过词云图和主题分布图实现数据可视化。该方法能有效识别新闻热点,为信息筛选和决策提供支持。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1546

自定义VIEW实践——仪表盘指针转动效果实现

最近正好看到仪表盘效果,想着自己写写正好熟悉熟悉自定义View,效果实现不难,本人水平有限,如有错误请指出会及时修改,效果图如下 一、onMeasure重写 代码就不多解释了,重写onMeasure必备 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ceuHp7jC-1652694391860)(https://upload-images.jianshu.io/upload_images/13905016-2aacdae5207dc582.png)] 二、onD

yihanss的博客 908

《AI应用架构师智能特征工程实践的前沿趋势解读》

面对传统方法的局限性,智能特征工程(Intelligent Feature Engineering)应运而生。智能特征工程是指利用人工智能、机器学习和自动化技术,实现特征提取、构造、选择和优化过程的自动化、智能化和可扩展化的方法和技术体系。效率提升:将数据科学家从繁琐的人工特征工程中解放出来,大幅缩短特征开发周期。质量保障:通过系统化方法发现人类难以察觉的特征模式,提高特征质量和模型性能。可扩展性:能够处理大规模、高维度和多类型的数据,适应不同领域和场景。降低门槛。

大数据洞察的博客 1181

基于STM32F103C8T6单片机设计CAN接口8路继电器控制板硬件(原理图+PCB)+软件源码

基于STM32F103C8T6单片机设计CAN接口8路继电器控制板硬件(原理图+PCB)+软件源码,仅供学习及设计参考。

GJZGRB的博客 1417
上一篇: Android插件式开发+unity3d+EasyAr完成android实现ar插件式功能
下一篇: 自定义View进阶--手绘地图(一)
LZ涸泽而渔
博客等级 码龄10年 269粉丝 21原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值