1.无意看到了一个指南针的UI,在这里简单的模仿了一下。其实就是第画布的一些变化而已。

别人的效果图是:

  

3.简单说一下思路:

  1)首先是画一个黑色圆盘

  2) 然后画圆盘上的刻度(就是对Canvas一些变换)

  3) 文字添加

4.直接上代码:

  

  1 public class CompassView extends View {
  2     private Paint circlePaint, tickPaint;
  3     private TextPaint textPaint;
  4     // 指定控件宽和高,用于自适应
  5     private float vWidth, vHeight;
  6     // 圆盘的半径
  7     private float compassRadiu;
  8     // 刻度线段的长度
  9     private float tickHeight;
 10     // 字体高度和宽度
 11     private float textHeight, textWidth;;
 12
 13     public CompassView(Context context) {
 14         super(context);
 15         initPaint(context);
 16     }
 17
 18     public CompassView(Context context, AttributeSet attrs) {
 19         super(context, attrs);
 20         initPaint(context);
 21     }
 22
 23     private void initPaint(Context context) {
 24         // 对画圆盘画初始化
 25         circlePaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);
 26         circlePaint.setColor(Color.BLACK);
 27         circlePaint.setStyle(Paint.Style.FILL);
 28
 29         // 对刻度画笔进行初始化
 30         tickPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
 31         tickPaint.setColor(Color.RED);
 32         tickPaint.setStrokeWidth(3);
 33
 34         // 对字的画笔进行初始化
 35         textPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
 36         textPaint.setColor(Color.WHITE);
 37         textPaint.setTextSize(20);
 38
 39     }
 40
 41     // 自适应在这里做的
 42     @Override
 43     protected void onSizeChanged(int w, int h, int oldw, int oldh) {
 44         // 获取控件的宽和高
 45         vWidth = w;
 46         vHeight = h;
 47         compassRadiu = Math.min(w, h) / 2;
 48         tickHeight = (1 / 12F) * compassRadiu;
 49         textHeight = textPaint.descent() - textPaint.ascent();
 50
 51     }
 52
 53     @Override
 54     protected void onDraw(Canvas canvas) {
 55         canvas.drawColor(Color.CYAN);
 56         // 黑色圆盘
 57         canvas.drawCircle(compassRadiu, compassRadiu, compassRadiu, circlePaint);
 58         // 画红色的刻度
 59         int degress;
 60         float textWidth;
 61
 62         for (int i = 0; i < 24; i++) {
 63             canvas.save();
 64             canvas.translate(compassRadiu, compassRadiu);
 65             // 当前canvas旋转角度
 66             degress = i * 15;
 67             canvas.rotate(15 * i);
 68
 69             canvas.drawLine(0, -compassRadiu, 0, -compassRadiu + tickHeight,
 70                     tickPaint);
 71             switch (degress) {
 72             case 0:
 73                 textWidth = textPaint.measureText("45");
 74                 drawText(canvas, "45", textWidth);
 75                 break;
 76
 77             case 45:
 78                 textWidth = textPaint.measureText("东");
 79                 drawText(canvas, "东", textWidth);
 80                 break;
 81             case 90:
 82                 textWidth = textPaint.measureText("135");
 83                 drawText(canvas, "135", textWidth);
 84                 break;
 85             case 135:
 86                 textWidth = textPaint.measureText("南");
 87                 drawText(canvas, "南", textWidth);
 88                 break;
 89             case 180:
 90                 textWidth = textPaint.measureText("225");
 91                 drawText(canvas, "225", textWidth);
 92                 break;
 93             case 225:
 94                 textWidth = textPaint.measureText("西");
 95                 drawText(canvas, "西", textWidth);
 96                 break;
 97             case 270:
 98                 textWidth = textPaint.measureText("315");
 99                 drawText(canvas, "315", textWidth);
100                 break;
101             case 315:
102                 textWidth = textPaint.measureText("北");
103                 drawText(canvas, "北", textWidth);
104                 canvas.drawLine(0,
105                         -compassRadiu + tickHeight + textHeight + 10,
106                         -textWidth / 3, -compassRadiu + tickHeight + textHeight
107                                 + 30, tickPaint);
108                 canvas.drawLine(0,
109                         -compassRadiu + tickHeight + textHeight + 10,
110                         textWidth / 3, -compassRadiu + tickHeight + textHeight
111                                 + 30, tickPaint);
112
113                 break;
114             default:
115                 break;
116             }
117             canvas.restore();
118         }
119
120     }
121
122     private void drawText(Canvas canvas, String text, float textWidth) {
123
124         canvas.drawText(text, -(textWidth / 2), -compassRadiu + tickHeight
125                 + textHeight, textPaint);
126
127     }
128 }

运行后的效果图是:

  

源码下载

转载于:https://www.cnblogs.com/liangstudyhome/p/4389537.html

Android 画指南针相关推荐

  1. Android 实现指南针效果

    Android 实现指南针效果 前一段时间在做指南针,于是想偷偷懒.在网上直接找一个Demo.然后改改旧差不多了.可是看到的效果却和预期的差太多了,所以就不得不自己撸一个: 大致上会用到内容 自定义V ...

  2. Android中指南针的实现

    其实这篇博客不是做真正的指南针,因为真正的指南针需要做一个完整的自定义控件来指示方向.我们这里只是简单通过代码获取用户手机头部指向的方向.这个功能往往在我们定位获取的时候,用户方向变更后进行采集.车辆 ...

  3. Android学习-指南针(方向传感器)

    Android学习-指南针 效果图(背景图片网上随便找的): 1.编写布局文件activity_main.xml文件 主要放一个东南西北方向图片,一个指针图片用来指明方向 <?xml versi ...

  4. [转载]android 画虚线、实线,画圆角矩形,一半圆角

    [转载]android 画虚线.实线,画圆角矩形,一半圆角 (2013-03-19 12:38:12) 转载▼ 标签: 转载 分类: android 原文地址:android 画虚线.实线,画圆角矩形 ...

  5. Android 画一个 iPhone 样式的小时钟

    Android 画一个 iPhone 样式的小时钟 起因 iPhone主界面的时钟几乎每天都会看到,某天突发奇想,用Android是否也可以画一个类似的呢?于是决定也尝试着画一个,顺便巩固下自绘控件的 ...

  6. Android之指南针(电子罗盘)学习

    点我下载源码 5月12日更新到V5版:http://download.csdn.net/detail/weidi1989/5364243 今天,在小米的开源项目中下载了一个指南针源码学习了一下,感觉不 ...

  7. Android之指南针学习

    5月12日更新到V5版:http://download.csdn.net/detail/weidi1989/5364243 今天,在小米的开源项目中下载了一个指南针源码学习了一下,感觉不仅界面做得很漂 ...

  8. Android之指南针

    点我下载源码 今天,在小米的开源项目中下载了一个指南针源码学习了一下,感觉不仅界面做得很漂亮,代码也是很精致,所以我在研究了之后,加了比较多的注释,果断跟大家分享一下,很精简的几段代码,仔细品味可以学 ...

  9. Android 画虚线 DashPathEffect 使用详解

    代码 package com.example.view;import android.content.Context; import android.graphics.Canvas; import a ...

  10. android画一个圆形图片组件

    imageview 显示圆形图片如下图. 圆形头像原理. 1.根据图片创建一个大小相同的画布. 2.在画布上画一个圆形. 3.画一个绘制交集,显示上层. // 将圆形图片,返回Bitmappublic ...

最新文章

  1. 云知声CEO黄伟:AI对产业的驱动不仅是创新更是颠覆
  2. 大数据的3V和三个层面
  3. WinForm组件开发:构造ImageButton控件
  4. istringstream
  5. 如何学习网络协议(学习笔记)
  6. 使用Linux LiveCD 评估系统的安全性
  7. Python中的遇到的错误(持续更新)
  8. reactjs基础知识:原生事件绑定
  9. 根文件系统定制【ZT】
  10. Intel Hyperscan简介
  11. 在c语言中large的作用,输入两个数组,调用large函数比较,计数,输出统计结果...
  12. 从前景、待遇、入门难度分析,Java和HTML5哪个好
  13. php感悟1500,《苏菲的世界》读书笔记及心得感悟1500字
  14. 《R语言机器学习:实用案例分析》——1.3节使用函数
  15. 2019数据安装勾选_【登陆、勾选、签名......,你在发票平台遇到的各类问题这里都有答案!】增值税发票综合服务平台常见问题整理(一)...
  16. Matlab求方差,均值
  17. 大前研一《思考的技术》
  18. 全站仪和手机连接软件_测量员APP全站仪设站的的应用说明
  19. 心已被爱伤透,情已为爱枯竭
  20. Windows系统盘瘦身指南

热门文章

  1. c语言标准体重测试指数分男女,测测你的体脂率附男女标准体脂率对照表
  2. go操作excel单元格合并
  3. 企业该如何做好IT规划
  4. IE浏览器主页被劫持,如何解决主页被篡改问题?
  5. win10 python安装以及编辑器pycharm安装
  6. Blender中的事件处理器
  7. CodeForces - 3B Lorry【贪心】
  8. Word各级标题格式设置和自动排序(标题序号)设置
  9. 中国金控盐碱地水稻 国稻种芯-林裕豪:粮食安全两会热点
  10. angular7.0+ngx-weui公众号开发,开发及框架搭建(一)