android 定位 指南针,Android 实现指南针效果
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 实现指南针效果相关推荐
- android 定位 广播,android - 如何触发广播接收器在GPS开启/关闭? - SO中文参考 - www.soinside.com...
如何触发广播接收器在GPS开启/关闭? 问题描述 投票:35回答:5 public class BootReceiver extends BroadcastReceiver { @Override p ...
- android定位周边,Android 使用高德SDK编写周边搜索定位
转载请注明! 前言 使用高德SDK实现定位及周边的搜索界面,先看效果图: 使用到了高德以下sdk: com.amap.api:3dmap:latest.integration com.amap.api ...
- android+定位跟踪,android实现远程定位追踪(UC+XSS)
前言 当PC时代的辉光逐渐隐入了暮霭,一轮更加炫目的红日正在缓缓升起,时至今日,移动互联网已经成为引领时代发展与前沿技术不断革新的中流砥柱,短短十数年 间,手机的兴盛就超出了所有人的预料,大海淘沙,洗 ...
- android 定位蓝牙,Android开发-蓝牙RSSI定位
RSSI(Received Signal Strength Indication)是接收的信号强度指示,用来判定链接质量,利用RSSI信号值可以计算主设备和蓝牙设备的距离信息.通过至少三个设备的RSS ...
- android 定位蓝牙,Android BLE定位应用(蓝牙搜索方法)
最近刚好有一个需求,需要实时收取并保存指定蓝牙广播,用于蓝牙定位应用. 然后我使用老方法注册广播开启蓝牙搜素,发现并不能实时收到广播,有时会隔个几秒. 这个当然是不行的,蓝牙定位最低要求也是需要一秒一 ...
- 高德sdk定位当前位置_相关下载-Android 定位SDK | 高德地图API
高德 开发 Android 定位SDK 相关下载 更新时间:2020年11月16日 { "tab":[ "Android 定位SDK", "Andro ...
- android 定位 策略
from:http://www.51testing.com/html/87/n-3724787.html Android定位方式 Android常用的三种定位方式有:基于GPS定位.基于基站定位.基于 ...
- Android 利用方向传感器实现 指南针
step1:新建一个项目Compass,并将一张指南针图片导入到res/drawable-hdpi目录中 step2:设计应用的UI界面,main.xml <?xml version=" ...
- Android 利用方向传感器实现 指南针
step1:新建一个项目Compass,并将一张指南针图片导入到res/drawable-hdpi目录中 step2:设计应用的UI界面,main.xml <?xml version=" ...
- Android高德地图自定义地图指南针
高德地图的指南针默认位置在地图的左上角,并且位置不可以修改.我们可以自定义一个指南针. 效果如下图 1.在布局文件定义一个ImageView <ImageView android:id=&quo ...
最新文章
- class h5 点击后样式变化_css实现选中后变色并且效果不消失
- 从struts2拦截器到自定义拦截器
- python数字转换_Python实现中文数字转换为阿拉伯数字的方法示例
- java循环输出_Java实现excel导出(内容循环多个)
- django xadmin 默认密码_Django的认证系统
- Android框架Volley使用:Post请求实现
- I学霸官方免费教程二十八:Java排序算法之选择排序和冒泡排序
- 关于Apache Struts2远程执行任意命令漏洞的紧急通报
- Oracle 常用脚本1
- 免费分享20套PHP源码
- html阿里矢量图标库,矢量图标素材库_阿里巴巴矢量图标库的使用
- 最新超详细的VMware虚拟机的下载与安装
- Bootstrap 可视化布局--拖拽后弹窗进行编辑
- 计算机远程怎么设置路由器,路由器远程登录设置方法
- Linux内存从0到1学习笔记(9.4,内存优化调试之使用page_owner分析内存黑洞)
- goland连接数据库
- C语言与JAVA区别
- python c++情侣网名是什么意思_网友:c++与Python,究竟谁才是大哥?
- 2021机械高考caxa技能考试成绩查询,技能查成绩
- 计算机无法访问另一台计算机,同在一个局域网内,我的机子不能访问另一台计算机...
热门文章
- 微信公共平台开发接口(一)
- 黎曼可积和若尔当可测
- Rasa 3.x 学习系列-Rasa 3.1+ ElasticSearch 8.2.0 对话机器人实战六
- gmail如何配置163邮箱服务器端口,hotmail,gmail,live,QQ,163,yahoo邮箱服务器及端口号,outlook,foxmail 设置...
- server sql 去 反斜杠_mssql sqlserver 检索字段中是否包含反斜杠的方法
- excel多表格整合去重与空格去除
- OpenCV视频篇——码流 / 码率 / 比特率 / 帧速率 / 分辨率
- 随机存取存储器(RAM)的最大特点是什么?
- Word排版技巧数模论文必备
- 台式计算机睡眠状态耗电多吗,电脑休眠后,会不会耗电的?