Android 实现指南针效果

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

大致上会用到内容

- 自定义View

- GPS定位模块

- 方向传感器

开始,创建一个view

先写一个类继承view

不断对OnDraw事件进行重绘

传入方向

OK.那么新建一个DirectionView 来继承view public class DirectionView extends View {

}

那么绘制需要用到什么。用到画笔。宽度。等等一系列参数。 public class DirectionView extends View {

/**

* 圆环使用

* */

private Paint mRingPaint;

private Paint mCententPaint; //绘制中心实线的画布

/**

* 圆环半径 根据view的宽度计算

* */

private int mRadius = 200;

/**

* 圆环的中心点 -- 画圆环和旋转画布时需要使用

* */

private int x, y;

/**

* 圆环动画使用 -- 与mRingPaint唯一不同得方在于颜色

* */

private Paint mRingAnimPaint;

/**

* 圆环大小 矩形

* */

private RectF mRectf;

private Context mContext;

/**

* 圆环 宽度

* */

private final int mHeartPaintWidth = 50;

/**

* 圆环动画开始时 画弧的偏移量

* */

private int mAnimAngle = -1;

}

初始化部分我们先不管。看到效果图.我们是不是需要先将360度的齿轮画好。

这里我们就需要对ondraw 来操作了。

绘制嘛。必须要画板嘛

canvas.setDrawFilter(mDrawFilter);//在canvas上抗锯齿

//由于drawArc默认从x轴开始画,因此需要将画布旋转或者绘制角度旋转,2种方案

//int level = canvas.save();

//先绘制竖线

canvas.drawLine(x,mRectf.top + 30, x , mRectf.top - 60,mCententPaint);

//绘制中心线

canvas.drawLine(x,y-80,x,y + 80,mCententPaint);

canvas.drawLine(x - 80,y,x + 80, y ,mCententPaint);

canvas.rotate(rotate, x, y);// 旋转的时候一定要指明中心

for (int i = 0; i < 360; i += 3) {

canvas.drawArc(mRectf, i, 1, false, mRingPaint);

}

这里喔们把360度的齿轮绘制了。大致上是每隔3度绘制一条。

那么绘制齿轮之后。我们是不是需要绘制东西南北了。

mCententPaint.setTextSize(50);

mCententPaint.setColor(Color.RED);

canvas.drawText("北",x,mRectf.top + mHeartPaintWidth + 50,mCententPaint);

mCententPaint.setColor(Color.BLACK);

canvas.rotate(90, x, y);// 旋转的时候一定要指明中心

canvas.drawText("东",x,mRectf.top + mHeartPaintWidth + 50,mCententPaint);

canvas.rotate(90, x, y);// 旋转的时候一定要指明中心

canvas.drawText("南",x,mRectf.top + mHeartPaintWidth + 50,mCententPaint);

canvas.rotate(90, x, y);// 旋转的时候一定要指明中心

canvas.drawText("西",x,mRectf.top + mHeartPaintWidth + 50,mCententPaint);

canvas.rotate(90, x, y);// 旋转的时候一定要指明中心

mCententPaint.setTextSize(30);

for (int i = 0; i < 360; i += 3) {

if(i == 0|| i == 30 || i ==60 || i ==90 || i ==120 || i == 150 || i == 180 || i == 210 || i == 240 || i == 270 || i == 300 || i == 330 || i== 0){

canvas.drawText(""+i,x,mRectf.top - mHeartPaintWidth ,mCententPaint);

canvas.rotate(30, x, y);// 旋转的时候一定要指明中心

}

}

那么整个代码就是:

package com.jonkming.easyui.hardware.compass.ui;

import android.content.Context;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.DrawFilter;

import android.graphics.Paint;

import android.graphics.PaintFlagsDrawFilter;

import android.graphics.RectF;

import android.util.AttributeSet;

import android.util.TypedValue;

import android.view.View;

import com.jonkming.easyui.R;

/**

* 指南针的自定位View

*@Title: DirectionView.java

*@Package com.jonkming.easyui.hardware.compass.ui

*@author HuangMingming

*@date 2016/11/10 19:16

*@version V1.0

*/

public class DirectionView extends View {

/**

* 圆环使用

* */

private Paint mRingPaint;

private Paint mCententPaint; //绘制中心实线的画布

/**

* 圆环半径 根据view的宽度计算

* */

private int mRadius = 200;

/**

* 圆环的中心点 -- 画圆环和旋转画布时需要使用

* */

private int x, y;

/**

* 圆环动画使用 -- 与mRingPaint唯一不同得方在于颜色

* */

private Paint mRingAnimPaint;

/**

* 圆环大小 矩形

* */

private RectF mRectf;

private Context mContext;

/**

* 圆环 宽度

* */

private final int mHeartPaintWidth = 50;

/**

* 圆环动画开始时 画弧的偏移量

* */

private int mAnimAngle = -1;

public DirectionView(Context context, AttributeSet attrs, int defStyle)

{

super(context, attrs, defStyle);

this.mContext = context;

init();

}

public DirectionView(Context context, AttributeSet attrs)

{

this(context, attrs, 0);

this.mContext = context;

init();

}

public DirectionView(Context context)

{

this(context, null);

this.mContext = context;

init();

}

private void init(){

mRingPaint = new Paint(Paint.ANTI_ALIAS_FLAG);

mRingPaint.setStrokeWidth(mHeartPaintWidth);

mRingPaint.setStyle(Paint.Style.STROKE);

mRingAnimPaint = new Paint(mRingPaint);

mRingAnimPaint.setColor(Color.WHITE);

//初始化心跳曲线

mDrawFilter = new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG);

mCententPaint = new Paint(Paint.ANTI_ALIAS_FLAG);

mCententPaint.setColor(Color.BLACK);

mCententPaint.setStrokeWidth(3);

}

/**

* canvas抗锯齿开启需要

* */

private DrawFilter mDrawFilter;

@Override

protected void onSizeChanged(int w, int h, int oldw, int oldh) {

super.onSizeChanged(w, h, oldw, oldh);

x = w / 2;

y = h / 2;

mRadius = w / 2 - mHeartPaintWidth * 3; //因为制定了Paint的宽度,因此计算半径需要减去这个

mRectf = new RectF(x - mRadius, y - mRadius, x + mRadius, y + mRadius);

}

public float rotate = 0;

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

canvas.setDrawFilter(mDrawFilter);//在canvas上抗锯齿

//由于drawArc默认从x轴开始画,因此需要将画布旋转或者绘制角度旋转,2种方案

//int level = canvas.save();

//先绘制竖线

canvas.drawLine(x,mRectf.top + 30, x , mRectf.top - 60,mCententPaint);

//绘制中心线

canvas.drawLine(x,y-80,x,y + 80,mCententPaint);

canvas.drawLine(x - 80,y,x + 80, y ,mCententPaint);

canvas.rotate(rotate, x, y);// 旋转的时候一定要指明中心

for (int i = 0; i < 360; i += 3) {

canvas.drawArc(mRectf, i, 1, false, mRingPaint);

}

mCententPaint.setTextSize(50);

mCententPaint.setColor(Color.RED);

canvas.drawText("北",x,mRectf.top + mHeartPaintWidth + 50,mCententPaint);

mCententPaint.setColor(Color.BLACK);

canvas.rotate(90, x, y);// 旋转的时候一定要指明中心

canvas.drawText("东",x,mRectf.top + mHeartPaintWidth + 50,mCententPaint);

canvas.rotate(90, x, y);// 旋转的时候一定要指明中心

canvas.drawText("南",x,mRectf.top + mHeartPaintWidth + 50,mCententPaint);

canvas.rotate(90, x, y);// 旋转的时候一定要指明中心

canvas.drawText("西",x,mRectf.top + mHeartPaintWidth + 50,mCententPaint);

canvas.rotate(90, x, y);// 旋转的时候一定要指明中心

mCententPaint.setTextSize(30);

for (int i = 0; i < 360; i += 3) {

if(i == 0|| i == 30 || i ==60 || i ==90 || i ==120 || i == 150 || i == 180 || i == 210 || i == 240 || i == 270 || i == 300 || i == 330 || i== 0){

canvas.drawText(""+i,x,mRectf.top - mHeartPaintWidth ,mCententPaint);

canvas.rotate(30, x, y);// 旋转的时候一定要指明中心

}

}

}

}

绘制完了之后我们是不是要写界面代码了。这里xml 布局就不贴出来了。后面可以直接去github 去看看

主界面主要的作用就是对sensor监听。并返回方向的角度。然后对上面定义的view进行方向赋值。然后通知view 重绘就可以了

@Override

protected void onResume() {

/**

* 获取方向传感器

* 通过SensorManager对象获取相应的Sensor类型的对象

*/

Sensor sensor = manager.getDefaultSensor(Sensor.TYPE_ORIENTATION);

//应用在前台时候注册监听器

manager.registerListener(listener, sensor,

SensorManager.SENSOR_DELAY_GAME);

super.onResume();

}

@Override

protected void onPause() {

//应用不在前台时候销毁掉监听器

manager.unregisterListener(listener);

super.onPause();

}

private final class SensorListener implements SensorEventListener {

private float predegree = 0;

@Override

public void onSensorChanged(SensorEvent event) {

/**

* values[0]: x-axis 方向加速度

values[1]: y-axis 方向加速度

values[2]: z-axis 方向加速度

*/

float degree = event.values[0];// 存放了方向值

predegree=-degree;

mCompassDegreeTxt.setText(""+((int)degree)+"°");

mCompassDirectionTxt.setText(formatPredegree(degree));

directionView.rotate = predegree;

directionView.postInvalidate();

}

@Override

public void onAccuracyChanged(Sensor sensor, int accuracy) {

}

}

android 定位 指南针,Android 实现指南针效果相关推荐

  1. android 定位 广播,android - 如何触发广播接收器在GPS开启/关闭? - SO中文参考 - www.soinside.com...

    如何触发广播接收器在GPS开启/关闭? 问题描述 投票:35回答:5 public class BootReceiver extends BroadcastReceiver { @Override p ...

  2. android定位周边,Android 使用高德SDK编写周边搜索定位

    转载请注明! 前言 使用高德SDK实现定位及周边的搜索界面,先看效果图: 使用到了高德以下sdk: com.amap.api:3dmap:latest.integration com.amap.api ...

  3. android+定位跟踪,android实现远程定位追踪(UC+XSS)

    前言 当PC时代的辉光逐渐隐入了暮霭,一轮更加炫目的红日正在缓缓升起,时至今日,移动互联网已经成为引领时代发展与前沿技术不断革新的中流砥柱,短短十数年 间,手机的兴盛就超出了所有人的预料,大海淘沙,洗 ...

  4. android 定位蓝牙,Android开发-蓝牙RSSI定位

    RSSI(Received Signal Strength Indication)是接收的信号强度指示,用来判定链接质量,利用RSSI信号值可以计算主设备和蓝牙设备的距离信息.通过至少三个设备的RSS ...

  5. android 定位蓝牙,Android BLE定位应用(蓝牙搜索方法)

    最近刚好有一个需求,需要实时收取并保存指定蓝牙广播,用于蓝牙定位应用. 然后我使用老方法注册广播开启蓝牙搜素,发现并不能实时收到广播,有时会隔个几秒. 这个当然是不行的,蓝牙定位最低要求也是需要一秒一 ...

  6. 高德sdk定位当前位置_相关下载-Android 定位SDK | 高德地图API

    高德 开发 Android 定位SDK 相关下载 更新时间:2020年11月16日 { "tab":[ "Android 定位SDK", "Andro ...

  7. android 定位 策略

    from:http://www.51testing.com/html/87/n-3724787.html Android定位方式 Android常用的三种定位方式有:基于GPS定位.基于基站定位.基于 ...

  8. Android 利用方向传感器实现 指南针

    step1:新建一个项目Compass,并将一张指南针图片导入到res/drawable-hdpi目录中 step2:设计应用的UI界面,main.xml <?xml version=" ...

  9. Android 利用方向传感器实现 指南针

    step1:新建一个项目Compass,并将一张指南针图片导入到res/drawable-hdpi目录中 step2:设计应用的UI界面,main.xml <?xml version=" ...

  10. Android高德地图自定义地图指南针

    高德地图的指南针默认位置在地图的左上角,并且位置不可以修改.我们可以自定义一个指南针. 效果如下图 1.在布局文件定义一个ImageView <ImageView android:id=&quo ...

最新文章

  1. class h5 点击后样式变化_css实现选中后变色并且效果不消失
  2. 从struts2拦截器到自定义拦截器
  3. python数字转换_Python实现中文数字转换为阿拉伯数字的方法示例
  4. java循环输出_Java实现excel导出(内容循环多个)
  5. django xadmin 默认密码_Django的认证系统
  6. Android框架Volley使用:Post请求实现
  7. I学霸官方免费教程二十八:Java排序算法之选择排序和冒泡排序
  8. 关于Apache Struts2远程执行任意命令漏洞的紧急通报
  9. Oracle 常用脚本1
  10. 免费分享20套PHP源码
  11. html阿里矢量图标库,矢量图标素材库_阿里巴巴矢量图标库的使用
  12. 最新超详细的VMware虚拟机的下载与安装
  13. Bootstrap 可视化布局--拖拽后弹窗进行编辑
  14. 计算机远程怎么设置路由器,路由器远程登录设置方法
  15. Linux内存从0到1学习笔记(9.4,内存优化调试之使用page_owner分析内存黑洞)
  16. goland连接数据库
  17. C语言与JAVA区别
  18. python c++情侣网名是什么意思_网友:c++与Python,究竟谁才是大哥?
  19. 2021机械高考caxa技能考试成绩查询,技能查成绩
  20. 计算机无法访问另一台计算机,同在一个局域网内,我的机子不能访问另一台计算机...

热门文章

  1. 微信公共平台开发接口(一)
  2. 黎曼可积和若尔当可测
  3. Rasa 3.x 学习系列-Rasa 3.1+ ElasticSearch 8.2.0 对话机器人实战六
  4. gmail如何配置163邮箱服务器端口,hotmail,gmail,live,QQ,163,yahoo邮箱服务器及端口号,outlook,foxmail 设置...
  5. server sql 去 反斜杠_mssql sqlserver 检索字段中是否包含反斜杠的方法
  6. excel多表格整合去重与空格去除
  7. OpenCV视频篇——码流 / 码率 / 比特率 / 帧速率 / 分辨率
  8. 随机存取存储器(RAM)的最大特点是什么?
  9. Word排版技巧数模论文必备
  10. 台式计算机睡眠状态耗电多吗,电脑休眠后,会不会耗电的?