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. 为什么stm32有的外设在进行初始化的时候需要将寄存器重设为缺省值?不设置会怎么样?

    首先,缺省值就是默认值的意思,默认值可以理解为设计芯片的人认为用这个参数,比较适中,起码不可能耽误你对某一模块进行驱动.然后,为什么除了默认值(缺省值),还有这么多其他的参数可以进行选择呢,那就要看你 ...

  2. winform 实现局部更新(如ajax实现)而整个界面不产生闪烁的解决方案

    转自原文winform 实现局部更新(如ajax实现)而整个界面不产生闪烁的解决方案 一.通过对窗体和控件使用双缓冲来减少图形闪烁(当绘制图片时出现闪烁时,使用双缓冲) 对于大多数应用程序,.NET ...

  3. C# Matlab 相互调用

    转自禾木junjie原文C# Matlab 相互调用 测试环境 VisualStudio2013 / .net4.0 Matlab2015b 高版本的matlab对外接其它语言做得很方便了,并不需要一 ...

  4. Python中的列表生成式和多层表达式

    Python中的列表生成式和多层表达式 如何生成[1x1, 2x2, 3x3, ..., 10x10]的列表? L=[]; ,): L.append(x*x) print L print (" ...

  5. linux安装mysql服务分两种安装方法:

    linux安装mysql服务分两种安装方法: ①源码安装,优点是安装包比较小,只有十多M,缺点是安装依赖的库多,安装编译时间长,安装步骤复杂容易出错: ②使用官方编译好的二进制文件安装,优点是安装速度 ...

  6. 10 华电内部文档搜索系统 search01

    Lucene解决搜索问题.ibatis实现存放问题,就是解决持久化问题.Struts 2做页面显示,就是实现业务层对应的功能. Spring与ibatis结合, 添加Spring支持 右击项目名s2i ...

  7. 解决:EXCEL复制粘贴,精度丢失

    公司一部分数据是存在elasticsearch里面的,但里面的ID设计得特别长,我是打算把ID号考出来,用jmeter批量 删除的,但复制粘贴到excel里,ID就会精度丢失. 后来找到一个办法,解决 ...

  8. Java-随机数工具类

    import java.util.Random; import java.util.concurrent.ThreadLocalRandom; import org.apache.commons.la ...

  9. Ubuntu 14.04 安装QQ2015

    作为重要的技术交流工具,Ubuntu下没有QQ还是挺不方便的. 参考链接(带软件下载链接)http://www.longene.org/forum/viewtopic.php?f=6&t=30 ...

  10. CentOS/RedHat安装Python3

    CentOS/RedHat安装Python3 摘自:https://blog.csdn.net/mvpboss1004/article/details/79377019 CentOS/RedHat默认 ...