这里对上一篇文章另外写的一个http://blog.csdn.net/u012840567/article/details/52860559

转载请标明出处http://blog.csdn.net/u012840567/article/details/52875214

这里是另一种比较好的实现方式。

输入框里面单位是 b/s 的形式 范围是 0- 20971520 b/s

代码部分:

private void init(Canvas canvas) {view_width = getWidth();if (getHeight() < getWidth())view_width = getHeight();elseview_height = getHeight();canvas.translate(view_width/2,view_height/2+arc_width);int radius = (int) (view_width/2 - arc_width) - 50; //圆环的半径  -50是为了给外面网速显示用的,否则会被覆盖drawArc(canvas,radius);//画圆弧drawFont(canvas,radius);//画字drawPoint(canvas,radius);//画中间那个指针drawScale(canvas,radius);//画刻度
}private void drawArc(Canvas canvas, int radius) {RectF arcRectF = new RectF(-radius,-radius,radius,radius);canvas.drawArc(arcRectF,134,272,false,arcPaint);//画圆弧  这个地方是为了与刻度重合//canvas.drawArc(arcRectF,135,270,false,arcPaint);//画圆弧canvas.save();canvas.restore();arcPaint.setColor(Color.BLACK);canvas.drawArc(arcRectF,134,progress,false,arcPaint);//画圆弧  这个地方是为了与刻度重合
}private void drawFont(Canvas canvas, int radius) {//测量字体宽度,我们需要根据字体的宽度设置在圆环中间float outSpeedTextWidth = outSpeedPaint.measureText(outSpeed[1]);canvas.drawText(outSpeed[0],-(int)(radius*Math.sin(degree))+outSpeedTextWidth/2,(int)(radius*Math.sin(degree)),outSpeedPaint);canvas.drawText(outSpeed[1],-radius-50,0+line_width,outSpeedPaint);canvas.drawText(outSpeed[2],-(int)(radius*Math.sin(degree))-line_width,-(int)(radius*Math.sin(degree))+outSpeedTextWidth/2,outSpeedPaint);canvas.drawText(outSpeed[3],0-outSpeedTextWidth/2,-radius-line_width,outSpeedPaint);canvas.drawText(outSpeed[4],(int)(radius*Math.sin(degree))-outSpeedTextWidth/2,-(int)(radius*Math.sin(degree))+outSpeedTextWidth/2,outSpeedPaint);canvas.drawText(outSpeed[5],radius+line_width,0+line_width,outSpeedPaint);canvas.drawText(outSpeed[6],(int)(radius*Math.sin(degree))-outSpeedTextWidth,(int)(radius*Math.sin(degree)),outSpeedPaint);float textWidth = centerPaint.measureText(centerSpeed);   //中间字体的宽度canvas.drawText(centerSpeed,-textWidth/2,centerSize/2,centerPaint);float speedTextWidth = speedPaint.measureText(speedFont);   //测量字体宽度,我们需要根据字体的宽度设置在圆环中间canvas.drawText(speedFont,-speedTextWidth/2,(int)(radius * Math.sin(degree) - speedTextWidth/2),speedPaint);}private void drawPoint(Canvas canvas, int radius) {Path path = new Path();path.moveTo(-radius+50, 0);// 此点为多边形的起点path.lineTo(-radius+150,10);path.lineTo(-radius+150,-10);path.close();canvas.save(); // 保存canvas状态canvas.rotate(progress-45);canvas.drawPath(path,arrowsPaint);canvas.restore();
}private void drawScale(Canvas canvas, int radius) {canvas.save(); // 保存canvas状态canvas.rotate(-90);radius = radius-50;//分辨率影响半径int startx = (int)(radius*Math.sin(degree));int starty = (int)(radius*Math.sin(degree));int stopx = (int)((radius-20)*Math.sin(degree));int stopy = (int)((radius-20)*Math.sin(degree));for (int i = 0; i < 7; i++) {canvas.drawLine(-startx-line_width/2,-starty-line_width/2,-stopx-line_width/2,-stopy-line_width/2,linePaint);canvas.rotate(degree);}canvas.save(); // 保存canvas状态canvas.restore();canvas.rotate(45);linePaint.setColor(Color.BLACK);for (int i = 0; i < progressnum; i++) {canvas.drawLine(-startx-line_width/2,-starty-line_width/2,-stopx-line_width/2,-stopy-line_width/2,linePaint);canvas.rotate(degree);}canvas.save(); // 保存canvas状态canvas.restore();
}

实现动画效果:

   public void setInternetSpeed(long internetSpeed) {this.internetSpeed = internetSpeed;calcSpeedNumber(internetSpeed);changearc();new Thread(){@Overridepublic void run() {super.run();try {for (int i = 0; i <= blackArc; i++){sleep(10);progress = i;if (progress > 0 && progress < 45){progressnum = 1;}else if (progress >= 45 && progress < 90){progressnum = 2;}else if(progress >= 90 && progress < 135){progressnum = 3;}else if(progress >= 135 && progress < 180){progressnum = 4;}else if(progress >= 180 && progress < 225){progressnum = 5;}else if(progress >= 225 && progress < 270){progressnum = 6;}else if(progress >= 270){progressnum = 7;}else {progressnum = 0;}postInvalidate();//从新绘制}} catch (Exception e) {e.printStackTrace();}}}.start();
}

改变量的计算方式:没有什么好的办法

  private void changearc() {int speedDegree = (int)getInternetSpeed()/1024;//换算成kbif (speedDegree > 0 && speedDegree < 1024){if (speedDegree >0 && speedDegree < 256){blackArc = speedDegree*45/256;blacknum = 1;}else if(speedDegree == 256){blackArc = 45;blacknum = 2;}else if(speedDegree > 256 && speedDegree <512){blackArc = (speedDegree-256)*45/256+45;blacknum = 2;}else if (speedDegree == 512){blackArc = 90;blacknum = 3;}else if(speedDegree > 512 && speedDegree <1024){blackArc = (speedDegree-512)*45/512+90;blacknum = 3;}}else {if(speedDegree == 1024){blackArc = 135;blacknum = 4;}else if(speedDegree > 1024 && speedDegree < 5120){blackArc = (speedDegree-1024)*45/4096+135;blacknum = 4;}else if(speedDegree == 5120){blackArc = 180;blacknum = 5;}else if(speedDegree > 5120 && speedDegree < 10240){blackArc = (speedDegree-5120)*45/5120+180;blacknum = 5;}else if(speedDegree == 10240){blackArc = 225;blacknum = 6;}else if (speedDegree > 10240 && speedDegree < 20480){blackArc = (speedDegree-10240)*45/10240+225;blacknum = 6;}else if(speedDegree == 20480){blackArc = 270;blacknum = 7;}}blackArc = blackArc + 2;
}

说明一点,不同分辨率手机可能不一样 ,我这里是1280x768 的。可能需要从新去画一下刻度的位置 185 行 radius = radius-50;//分辨率影响

重要说明,这里的刻度度数是一样的,但是增量不一样,难得计算刻度直接的转换。和画刻度,太难计算了,我这里只是一个demo,可以参考一下

参考链接:http://blog.sina.com.cn/s/blog_4cd5d2bb0101g2la.html
http://download.csdn.net/detail/jerseyho/8588141

demo下载地址:http://download.csdn.net/detail/u012840567/9659304

android 网速刻度盘 自定义view二相关推荐

  1. android网速测试app,Android网速测试App(二)

    上网速度测试软件名称:上网速度测试 软件版本:2.0 软件大小:2.83MB 软件授权:免费 适用平台:Android 这款App的名字很直接,就是上网速度测试.上网速度测试可以测试网络的上下行速度和 ...

  2. android下雨动画效果,Android 自定义View(二) 下雨效果

    Rain.gif Android 自定义View(二) 下雨效果 一 实现思路, 雨点用线段表示,通过控制线段的大小和宽度来表示不同的线段. 一个雨点下雨的过程可以表示为一条直线,一次雨点在下雨的过程 ...

  3. Android实现雪花特效自定义view

    一.前言 这个冬天,老家一直没有下雨, 正好圣诞节,就想着制作一个下雪的特效. 圣诞祝福:平安夜,舞翩阡.雪花飘,飞满天.心与心,永相伴. 圣诞节是传统的宗教节日,对于基 督徒,那是庆祝耶稣的诞生,纪 ...

  4. Android 气泡动画(自定义View类)

    Android 气泡动画(自定义View类) 一.前言 二.代码 1. 随机移动的气泡 2.热水气泡 一.前言 最近有需求制作一个水壶的气泡动画,首先在网上查找了一番,找到了一个文章. https:/ ...

  5. android怎么测试网速,Android网速测试App(三)

    网速测试助手软件名称:网速测试助手 软件版本:1.1 软件大小:817KB 软件授权:免费 适用平台:Android 这是一款比较简单的网速测试App,没有分开延迟值.上下行乃至线程数测试,只会直接告 ...

  6. Android动画特效之自定义View

      Android动画特效之Animator属性动画实现_Angel-杭州的博客-CSDN博客   我在百忙之中抽出宝贵时间来实现Android动画特效,也就是Android Animator动画效果 ...

  7. Android自定义View(二)

    文章目录 1.构造函数 2.onMeasure() 2.1.MeasureSpec 3.onSizeChanged() 4.onLayout() 5.onDraw() 上一篇: Android自定义V ...

  8. 【Android 应用开发】自定义View 和 ViewGroup

    一. 自定义View介绍 自定义View时, 继承View基类, 并实现其中的一些方法. (1) ~ (2) 方法与构造相关 (3) ~ (5) 方法与组件大小位置相关 (6) ~ (9) 方法与触摸 ...

  9. java实时获取android网速_Android中获取实时网速(2)

    一.实现思路: 1.Android提供有获取当前总流量的方法 2.上一秒 减去 下一面的流量差便是网速 3.注意计算 二.计算网速的工具类: package imcs.cb.com.viewappli ...

最新文章

  1. [转]解决 cannot restore segment prot after reloc: Permission denied
  2. java启动100线程_Java启动新线程的几种方式(Runnable、Callable、CompletableFuture)
  3. 二、抽象层的Builder模式
  4. Exception in thread “main“ java.lang.NoSuchMethodError: scala.collection.mut
  5. 程序员山洞开发程序,两年敲45万行代码,网友:一般人扛不住
  6. HDU 5980 位运算 进制转换函数 DEV C++调试失败的原因
  7. 重读《JAVA与模式》之二
  8. 如何使Tello无人机能够通过Python进行条形码扫描?
  9. 北京大学网络教育学院计算机,北京大学继续教育部
  10. Centos实现软路由
  11. libcurl 使用说明和网页抓取 linux下的curl编程
  12. 电脑蓝屏按哪三个键恢复?怎么修复蓝屏问题
  13. 自动化测试的优缺点分析
  14. 硬件选型之如何看光耦器件的开关频率
  15. spring boot项目使用ojdbc8连接oracle 12c(12.2.0.1.0),解决启动极慢问题!
  16. 一行代码轻松搞定各种IE兼容问题,IE6,IE7,IE8,IE9,IE10
  17. Java全文搜索怎么弄的_全文搜索 简介
  18. 互联网2B和2C的区别
  19. 艺赛旗RPA 网页处理系列(四):网页表格中获取数据,并点击相应记录后的按钮操作说明总结
  20. Dashgo D1使用手册

热门文章

  1. python 多因素方差分析_多因素方差分析估计平方和的三种方法
  2. 一个典型的语音识别系统
  3. 属于python保留字的是_属牛的女人全集:属牛女的性格、命运、属相婚配表等-第一星座网...
  4. 云与瘦客户机 未来IT数据安全延续
  5. 数据库学习2 排序检索数据
  6. 手游还能这么玩?电脑控制手机鼠标键盘大屏玩手游了解一下
  7. Android:WebView使用常见问题汇总(持续更新)
  8. java pdf添加文字水印(非常专业)
  9. 世界地图的制作(总体概念设计)
  10. Superset系列9- 制作地图