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. Spring 中的 LocalSessionFactoryBean和LocalContainerEntityManagerFactoryBean

    Spring和Hibernate整合的时候我们经常会有如下的配置代码 1,非JPA支持的配置 <!-- 配置 Hibernate 的 SessionFactory 实例: 通过 Spring 提 ...

  2. selenium安装方式

    selenium的二种安装方式 1.在线安装:打开cmd输入, pip.ext install selenium 2.离线安装,下载selenium安装包,然后解压,在cmd中进入到解压的文件中,在运 ...

  3. 学习ios一段过程后的思考

    现在回想起来,学习ios也有一段时间了,大概三个月不到吧,本来是搞linux驱动,刚开始来公司就我一个人负责驱动的东西,主要就是一些bug的解决,后来系统基本上稳定了,我就闲下来了,公司又有些移动医疗 ...

  4. python's unittest

    [python's unittest] unittest supports some important concepts: 从上图可以看到,unittest中的test-case.test-suit ...

  5. git服务器搭建问题

    CentOS6.5本地搭建. 对于图形化的系统,可以联网,然后CTRL+ALT+F2可以切换到命令行,CTRL+ALT+F1可以切换回桌面图形化. 可以用SSH和FTP来连接服务器和传文件.   (1 ...

  6. len=in.read(b,0,len)和len=in.read(b)的区别

    byte[] byte = new byte[1024]; int len =0 ; while((len=in.read(b))!=-1){ out.write(b,0,len); } read函数 ...

  7. java-tip-Collections.synchronized系列生成的容器

    这个系列的容器,和Vector或者HashTable之流的差不多, 区别是: Vector和HashTable是在关键方法上加synchronized关键字 而 Collections.synchro ...

  8. 钉钉开发笔记(三)MySQL的配置

    最近在编写web的过程中,经常需要与后台工作人员互动.由于比较麻烦.没有效率. 就果断的请教了,公司的后台大牛,学习下数据库的一些简单操作,现在就把利用MySQL连接服务器, 进行可视化操作的简单步骤 ...

  9. opennebula 添加kvm主机日志

    Sun Sep :: [ReM][D]: Req: UID: HostDelete invoked, Sun Sep :: [ReM][D]: Req: UID: HostDelete result ...

  10. hra控件自动绑定

    1.前台js代码 $.ajax({ type: "post", url: 'AlmMarketScenarioDetailManage.aspx?_method=queryPane ...