2021SC@SDUSC移动互联网项目分析——指南针

2021SC@SDUSC

目录

Compass指南针综述

布局

所需基本知识

OnResume()

OnPause()

SensorManager

SensorEventListener

RotateAnimation

传感器获取用户方位

指针旋转动画

Activity生命周期 

总结


Compass指南针综述

教学案例“基于磁场传感器的指南针”主要根据手机传感器中的方向传感器获取用户的方位,再控制动画指出东南西北。如图:

因此app重点代码在于获取到手机的方向传感器的数据来确定用户方位,再控制照片旋转相应的角度指出东南西北。

布局

 此布局为线性布局,因此在activity_main.xml中使用<LinearLayout></LinearLayout>作为根元素。在内层添加文本为"NORTH"的TextView、默认文本为"0°"的TextView和页面中部的ImageView。

所需基本知识

OnResume()

Activity生命周期的简化图示

当Activity进入"已恢复"状态时来到前台,系统会调用此回调。

如果 Activity 从“已暂停”状态返回“已恢复”状态,系统将再次调用 onResume()方法。因此,您应实现 onResume(),以初始化在onPause()期间释放的组件,并执行每次 Activity 进入“已恢复”状态时必须完成的任何其他初始化操作。

OnPause()

当发生中断事件时,Activity 进入“已暂停”状态,系统调用 onPause()回调。

系统将此方法视为用户将要离开app的 Activity 的第一个标志。使用 onPause()方法暂停或调整当Activity处于“已暂停”状态时不应继续(或应有节制地继续)的操作,以及app希望很快恢复的操作。

SensorManager

手机上搭载多种多样传感器,如方向传感器、加速感应器、陀螺仪感应器、NFC传感器等。SensorManager是系统所有传感器的管理器,可以通过SensorManager的实例调用getDefaultSensor()方法来得到任意的传感器类型。

SensorManager的registerListener()方法可以为传感器注册SensorEventListener,这样传感器才能加上监听。registerListener()方法需要传入三个参数——第一个参数为SensorEventListener的实例,第二个参数为Sensor的实例,第三个参数为传感器输出信息的更新速率(SENSOR_DELAY_UI 、SENSOR_DELAY_NORMAL 、SENSOR_DELAY_GAME 和SENSOR_DELAY_FASTEST四个值,速度依次递增)。 

SensorEventListener

SensorEventListener是一个接口,主要实现对传感器的监听,其中定义了 onSensorChanged()和onAccuracyChanged()这两个方法。onAccuracyChanged()在传感器精度发生变化时被调用,onSensorChanged()在传感器检测到数值变化时被调用。

用户可创建类实现SensorEventListener接口,实现onSensorChanged()和onAccuracyChanged()这两个方法,定义传感器改变时的操作。

RotateAnimation

RotateAnimation类是Android系统中的旋转变化动画类,用于控制View对象的旋转动作,该类继承于Animation类。RotateAnimation类中的很多方法都与Animation类一致,该类中最常用的方法便是RotateAnimation构造方法。

RotateAnimation旋转坐标系为以旋转点为坐标系(0,0)点。x轴为0度,顺时针方向旋转一定的角度。RotateAnimation类拥有多个构造系统,我们经常使用以下几种:

RotateAnimation(fromDegrees, toDegrees) (默认以View左上角顶点为旋转点)。

X轴顺时针转动到fromDegrees为旋转的起始点,X轴顺时针转动到toDegrees为旋转的起始点。

RotateAnimation(float fromDegrees, float toDegrees, float pivotX, float pivotY)
(pivotX,pivotY)为旋转点。pivotX为距离左侧的偏移量,pivotY为距离顶部的偏移量。即为相对于View左上角(0,0)的坐标点。

RotateAnimation (float fromDegrees, float toDegrees, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)
float fromDegrees:旋转的开始角度。
float toDegrees:旋转的结束角度。
int pivotXType:X轴的伸缩模式,可以取值为ABSOLUTE、RELATIVE_TO_SELF、RELATIVE_TO_PARENT。
float pivotXValue:X坐标的伸缩值。
int pivotYType:Y轴的伸缩模式,可以取值为ABSOLUTE、RELATIVE_TO_SELF、RELATIVE_TO_PARENT。
float pivotYValue:Y坐标的伸缩值。 

传感器获取用户方位

为了获得用户的传感器,首先调用getSystemService()方法获得用户手机的SensorManager实例。

通过SensorManager实例manager调用getDefaultSensor()方法来获得用户手机的方向传感器sensor,并且调用SensorManager的registerListener()方法为此方向传感器注册监听(第一个参数为SensorEventListener的实例,第二个参数为方向传感器实例sensor,第三个参数为传感器输出信息的更新速率)。

listener实际上是实现了SensorEventListener接口的类SensorListener的实例,通过实现接口中的onSensorChanged()方法在传感器检测到数值变化时完成指针旋转指向North。

指针旋转动画

类SensorListener实现SensorEventListener接口,并实现onSensorChanged()方法以实现指针旋转动画效果。

在传感器数值变化时 onSensorChanged(SensorEvent event)会被调用。

首先将event.value[0]赋值给degree,即degree存放了用户的方向值。

float a = (float)(Math.round(degree*10))/10;这行代码将方向值规范为保留小数点后一位的格式。通过获取界面表示方向值的TextView(text_degree),再通过调用setText()表示为用户此时的方向值。

再用if...else为表示方向值的TextView设置颜色变化

当用户所处位置北向方位与手机正北方相差5°之内颜色即为红色,当用户所处位置北向方位与手机正北方相差5°之外颜色即为白色。

 

通过调用RotateAnimation类的构造方法创建一个animation实例(此构造方法上文已介绍),再通过调用imageView.setAnimation(animation)为指针图片添加旋转动画。

predegree(旋转开始角度)初始值为0,当旋转动画完成后predegree赋值为-degree(旋转结束角度),保证了程序的正确性。

Activity生命周期 

主程序mainActivity首先调用onCreate(),Activity进入"已创建"状态。它会在系统首次创建Activity时触发,onCreate()方法在Activity的整个生命周期中只应发生一次。

其次Activity进入"已开始"和"已恢复"时,系统会调用onStart()onResume()回调函数。

用户每次重新启动app主Activity时,系统都会调用onResume()回调函数。onResume()需要完成重新获取用户手机的方向传感器并为用户手机的方向传感器加上监听的操作,所以需要将

Sensor sensor = manager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
manager.registerListener(listener, sensor,
        SensorManager.SENSOR_DELAY_GAME);

放入onResume()回调函数中。

当用户短暂离开程序时,系统调用 onPause()方法暂停或调整当Activity处于“已暂停”状态时不应继续(或应有节制地继续)的操作。所以我们需要注销传感器的监听。

总结

指南针app实现较为简单,但是却帮助读者学习到SensorManager类、SensorEventListener接口和RotateAnimation类的使用方法,并且对Activity生命周期中onPause()和onResume()这两个回调函数有了实际地运用和深刻的理解。

这个app相较于"入门Hello World"不再集中教学Android的界面,而是更注重使用Android的类获取与使用用户手机信息,从而帮助读者完成更为复杂的app,教学循序渐进。

指南针app设计合理,界面美观。但功能设计较为简单粗糙,精度不够准确。

可以添加经纬度定位功能,帮助读者了解LocationManager(位置管理器)和 LocationProvider(位置提供器)等Android定位相关的API。

这样既能完善功能,也能帮助读者学习到更多Android知识。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值