1. 布局添加一个imageView,在加一个自定义pointer视图(需要加上包名)
<FrameLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"android:layout_height="match_parent" tools:context="com.example.zhibei.MainActivity"><ImageViewandroid:src="@drawable/background"android:layout_gravity="center"android:layout_width="wrap_content"android:layout_height="wrap_content" /><com.example.zhibei.pointerandroid:layout_gravity="center"android:layout_width="wrap_content"android:layout_height="wrap_content" />
</FrameLayout>
  1. 自定义pointer视图
    我们需要继承View类并实现SensorEventListener接口。
  • 重写构造方法,并在构造方法中获取SensorManager对象并注册磁场传感器{Sensor.TYPE_MAGNETIC_FIELD}
  • 实现了SensorEventListener我们要重写方法onSensorChanged是在传感器的值发生改变时调用,当值发生改变时在这里面调用重绘
  • postInvalidate会调用onDraw()方法,在这里面实现根据磁场强度对bitmap的旋转效果(当某一个轴是正对北方时,其磁场强度值是最大,当某一个轴是正东或正西方向时,其值为0)当y轴的值=0时,就相当于手机的顶部是正东或正西方向放置的;当y轴不=0时,需要调用tanh()来实现,tanh是双曲正切,在geogle搜索中,也没找出好找来,只发现在词典里好像有“双曲正切磁场”这么个东西,至于为什么要这么做,我了不知道,请知道的大哥能告知一下,先姑且这么记下来。
public class pointer extends View implements SensorEventListener{private SensorManager sensorManager;private float[] values;//创建一个数组,保存xyz轴的磁场强度值Bitmap bitmap;public pointer(Context context, AttributeSet attrs) {super(context, attrs);bitmap= BitmapFactory.decodeResource(super.getResources(),R.drawable.pointer);//获取传感器管理器sensorManager= (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);//注册传感器sensorManager.registerListener(this,sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),SensorManager.SENSOR_DELAY_GAME);}@Overridepublic void onSensorChanged(SensorEvent event) {if (event.sensor.getType()==Sensor.TYPE_MAGNETIC_FIELD){values=event.values;//刷新ui,Invalidate()不同, postInvalidate()可以通过组件来刷新主线程的值,调用ondraw方法postInvalidate();}}@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {}@Overrideprotected void onDraw(Canvas canvas) {if (values!=null){float x=values[0];//x轴的磁场强度float y=values[1];//y轴的磁场强度//设置旋转中心canvas.translate(this.getWidth()/2,this.getHeight()/2);if (y==0&&x>0){//如果x轴的磁场强度>0,y的=0,旋转90度canvas.rotate(90);}else if (y==0&&x<0){//如果x轴的磁场强度<0,y的=0,旋转270度canvas.rotate(270);}else{if (y>=0){canvas.rotate((float) Math.tanh(x/y)*90);}else{canvas.rotate(180+(float) Math.tanh(x/y)*90);}}}canvas.drawBitmap(bitmap,-this.bitmap.getWidth()/2,-this.bitmap.getHeight()/2,new Paint());super.onDraw(canvas);}
}

效果如下 :

android学习笔记之磁场传感器制做指南针相关推荐

  1. Pro Android学习笔记(二九):用户界面和控制(17):include和merge

    xml控件代码重用:include 如果我们定义一个控件,需要在不同的layout中重复使用,或者在同一个layout中重复使用,可以采用include的方式.例如定义my_button.xml如下 ...

  2. 【转】 Pro Android学习笔记(二九):用户界面和控制(17):include和merge

    目录(?)[-] xml控件代码重用include xml控件代码重用merge 横屏和竖屏landsacpe portrait xml控件代码重用:include 如果我们定义一个控件,需要在不同的 ...

  3. Android学习笔记21:ImageView获取网络图片

    Android平台有3种网络接口可以使用,它们分别是:java.net.*(标准java接口).org.apache(Apache接口)和android.net.*(Android网络接口).本文将使 ...

  4. Android学习笔记(七):多个Activity和Intent

    根据www.mars-droid.com:Andriod开发视频教学,先跳过书本<Beginning Android 2>的几个章,我是这两个资源一起看,需要进行一下同步.先初步了解一下应 ...

  5. Android学习笔记26:图片切换控件ImageSwitcher的使用

    在Windows操作系统中,要查看多张图片,可以通过使用"Windows照片查看器"在"上一张"和"下一张"之间切换,进行多张图片的浏览. ...

  6. Android学习笔记36:使用SQLite方式存储数据

    在Android中一共提供了5种数据存储方式,分别为: (1)Files:通过FileInputStream和FileOutputStream对文件进行操作.具体使用方法可以参阅博文<Andro ...

  7. Android学习笔记:TabHost 和 FragmentTabHost

    2019独角兽企业重金招聘Python工程师标准>>> Android学习笔记:TabHost 和 FragmentTabHostTabHost命名空间:android.widget ...

  8. Android学习笔记:TabHost 和 FragmentTabHost(转)

    Android学习笔记:TabHost 和 FragmentTabHost(转) 转自:http://www.cnblogs.com/asion/p/3339313.html 作者:Asion Tan ...

  9. Pro Android学习笔记(三三):Menu(4):Alternative菜单

    什么是Alternative menu(替代菜单) 举个例子,Activity显示一个文本文件.如果用户想对文本文件进行编辑,Activity不提供编辑能力,但可由其他activity或者其他应用提供 ...

最新文章

  1. 《挑战30天C++入门极限》C/C++中字符串常量的不相等性及字符串的Copy
  2. 基础概念总结(spring security、Quartz、JUnit测试)
  3. ap模式和sta模式共存_锐捷AP缺省VLAN和用户VLAN那些事儿 | 运维实战家
  4. pythonchar中的拟合方法_在python中利用numpy求解多项式以及多项式拟合的方法
  5. sun工作站linux,LINUX SUN Solaris 8操作系统安装指导书.doc
  6. JavaScript重难点解析3(原型与原型链、执行上下文与执行上下文栈)
  7. undefined reference to `main`
  8. Atitit.软件控件and仪表盘(23)--多媒体子系统--视频输出切换控制cvbs av s-video Ypbpr pal ntsc
  9. php 数组 没有越界,C++_浅析C语言编程中的数组越界问题,因为C语言不检查数组越界,而 - phpStudy...
  10. git提交代码时遇到代码库有更新以及本地有更新的解决方法
  11. 关于扫描枪输入英文乱码问题
  12. w7计算机超级管理员权限,win7系统取得管理员最高权限的操作方法
  13. centos7安装源设置基础软件仓库时出错
  14. jQuery淡入浅出
  15. SpringCloud入门实例
  16. 中州韵输入法 linux 小鹤双拼,在deepin 15.10系统fcitx框架下添加rime小鹤双拼的方法...
  17. 康奈尔本科学计算机要什么条件,康奈尔大学计算机专业申请条件详细解读
  18. Increasing trend of scientists to switch between topics论文翻译
  19. 易语言调用c 自定义数据类型,用__stdcall实现易语言调用C/C++的dll
  20. 使用python编程语言编写程序:输入a、b、c三个数,判断a、b、c能否构成三角形,如果能够构成三角形,判断该三角形是等腰三角形还是等边三角形,还是直角三角形,还是一般三角形。并计算周长和面积。

热门文章

  1. android窗帘拉开动画,H5+CSS3窗帘拉开收起动画特效源码
  2. 高级网格交易学习笔记
  3. 人工智能的未来--神经科学启发的类脑计算综述
  4. JS--购物车二级联动
  5. 保姆级教程:最新下载及安装vscode(含常用插件)
  6. 纯Css制作tab选项卡
  7. 《需求工程--软件建模与分析》笔记
  8. java 生成交易快照_Java生成订单号/交易流水号
  9. 使用prometheus监控服务器主机
  10. 用Java实现用户登录界面