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

别人的效果图是:

  

3.简单说一下思路:

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

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

  3) 文字添加

4.直接上代码:

  

 public class CompassView extends View {
private Paint circlePaint, tickPaint;
private TextPaint textPaint;
// 指定控件宽和高,用于自适应
private float vWidth, vHeight;
// 圆盘的半径
private float compassRadiu;
// 刻度线段的长度
private float tickHeight;
// 字体高度和宽度
private float textHeight, textWidth;; public CompassView(Context context) {
super(context);
initPaint(context);
} public CompassView(Context context, AttributeSet attrs) {
super(context, attrs);
initPaint(context);
} private void initPaint(Context context) {
// 对画圆盘画初始化
circlePaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);
circlePaint.setColor(Color.BLACK);
circlePaint.setStyle(Paint.Style.FILL); // 对刻度画笔进行初始化
tickPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
tickPaint.setColor(Color.RED);
tickPaint.setStrokeWidth(3); // 对字的画笔进行初始化
textPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
textPaint.setColor(Color.WHITE);
textPaint.setTextSize(20); } // 自适应在这里做的
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
// 获取控件的宽和高
vWidth = w;
vHeight = h;
compassRadiu = Math.min(w, h) / 2;
tickHeight = (1 / 12F) * compassRadiu;
textHeight = textPaint.descent() - textPaint.ascent(); } @Override
protected void onDraw(Canvas canvas) {
canvas.drawColor(Color.CYAN);
// 黑色圆盘
canvas.drawCircle(compassRadiu, compassRadiu, compassRadiu, circlePaint);
// 画红色的刻度
int degress;
float textWidth; for (int i = 0; i < 24; i++) {
canvas.save();
canvas.translate(compassRadiu, compassRadiu);
// 当前canvas旋转角度
degress = i * 15;
canvas.rotate(15 * i); canvas.drawLine(0, -compassRadiu, 0, -compassRadiu + tickHeight,
tickPaint);
switch (degress) {
case 0:
textWidth = textPaint.measureText("45");
drawText(canvas, "45", textWidth);
break; case 45:
textWidth = textPaint.measureText("东");
drawText(canvas, "东", textWidth);
break;
case 90:
textWidth = textPaint.measureText("135");
drawText(canvas, "135", textWidth);
break;
case 135:
textWidth = textPaint.measureText("南");
drawText(canvas, "南", textWidth);
break;
case 180:
textWidth = textPaint.measureText("225");
drawText(canvas, "225", textWidth);
break;
case 225:
textWidth = textPaint.measureText("西");
drawText(canvas, "西", textWidth);
break;
case 270:
textWidth = textPaint.measureText("315");
drawText(canvas, "315", textWidth);
break;
case 315:
textWidth = textPaint.measureText("北");
drawText(canvas, "北", textWidth);
canvas.drawLine(0,
-compassRadiu + tickHeight + textHeight + 10,
-textWidth / 3, -compassRadiu + tickHeight + textHeight
+ 30, tickPaint);
canvas.drawLine(0,
-compassRadiu + tickHeight + textHeight + 10,
textWidth / 3, -compassRadiu + tickHeight + textHeight
+ 30, tickPaint); break;
default:
break;
}
canvas.restore();
} } private void drawText(Canvas canvas, String text, float textWidth) { canvas.drawText(text, -(textWidth / 2), -compassRadiu + tickHeight
+ textHeight, textPaint); }
}

运行后的效果图是:

  

源码下载

Android 画指南针的更多相关文章

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

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

  2. android 画虚线、实线,画圆角矩形,一半圆角

    1.画虚线,实线: 建立dotted_line_gray.xml文件放在drawable文件夹下面. android:shape="line" 可以修改你想要的形状 <?xm ...

  3. android画虚线的自定义VIew

    package com.yesway.ycarplus.view; import android.annotation.SuppressLint; import android.content.Con ...

  4. Android画一个随意拖动的圆形

    import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactor ...

  5. Android 画个电池出来(Paint和canvas)

    1.Android中很多时候都要自己去画一个自定义控件出来,就需要用到Paint和Canvas这两个类. 2.效果图:

  6. Android画一条横线

    <View android:layout_width="match_parent" android:layout_height="1px" android ...

  7. Android 画直线并实现拖动

    自定义View,在onDraw()方法中绘制一条直线,在onTouch()方法中监听手指的移动. public class AroundDragView extends View implements ...

  8. Android 画闹钟

    1.今天就来模仿一下这个小闹钟的 2.思路: 先画闹钟的圆盘 ,在通过Path来画指针 两个耳朵其实就是用两个圆被一个大圆截取后留下的,并旋转一定度数后生成 3.直接上代码: public class ...

  9. android 画竖虚线

    参考:http://blog.csdn.net/zhao2017/article/details/73866460 1.在Android中写横虚线比较简单,写竖虚线的话稍微麻烦点: 需要将写的虚线旋转 ...

随机推荐

  1. [z]兼容IE6的相对于浏览器窗口定位

    http://blog.uedsc.com/css-position.html http://www.w3cmm.com/notepad/css-position.html http://sofish ...

  2. Shiro异常处理总结

    出自:https://blog.csdn.net/goodyuedandan/article/details/62420120 一.Spring MVC处理异常有3种方式: (1)使用Spring-M ...

  3. mfc对话框启动就直接隐藏在右下角显示托盘图标

    之前在网络上找了一份mfc对话框启动就直接隐藏窗体,在右下角显示托盘图标的demo 在win7下可以正常使用,但在win10上直接溢出,导致计算机跟注销似的崩溃现象. 后来找到原因是因为在OnInit ...

  4. UML建模之时序图(Sequence Diagram)<转>

    UML建模之时序图(Sequence Diagram)   一.时序图简介(Brief introduction) 二.时序图元素(Sequence Diagram Elements) 角色(Acto ...

  5. k8s podpreset 参数注入

    启动apiserver时,增加 参数 --runtime-config=settings.k8s.io/v1alpha1=true kind: PodPresetapiVersion: setting ...

  6. space defender,太空版植物大战僵尸 游戏基本框架的设计

  7. EasyBuy项目总结_20180409

    一.项目技术点 1.熟练使用jsp及el和jstl表达式 el: $() jstl: 1.导包; 2.声明<%@ taglib uri=" " preffix="c ...

  8. ubuntu14.04 64 位 vmware tools 问题

    当提示说open-vm-tools版本太低时可以这样解决 1.sudo apt-get autoremove open-vm-dkms open-vm-tools --purge 2.安装vmware ...

  9. p4475 巧克力王国

    传送门 分析 我们多维护一个值,代表某个点子树中所有点的权值和 于是如果某个点它的min和max乘a(/b)的值小于范围则直接把整个子树都加进去 估价函数就是这个点的子树中的理论最小值 代码 #inc ...

  10. nhibernate 3.x新特性

    http://www.360doc.com/content/14/0226/17/9316347_355904008.shtml