2021SC@SDUSC移动互联网项目分析——晃动取消闹钟(四)

2021SC@SDUSC

前面文章主要分析了“晃动取消闹钟”的页面布局、设置/取消闹钟、响铃功能,这篇文章主要分析晃动取消响铃功能。

目录

所需基本知识

Vibrator

添加权限

常用方法

使用流程

SensorManager

常用方法

加速度传感器

晃动取消闹钟功能

创建振动

注册传感器监听

监听传感器

总结


所需基本知识

Vibrator

Vibrator是用来让设备振动的一个类,是Android给开发者提供的用于机身振动的一个服务。如果使用振动器的进程退出,启动的任何振动都将停止。

添加权限

使用振动器需要在AndroidManifest.xml中添加权限:

<uses-permission android:name="android.permission.VIBRATE />

常用方法

cancel:关闭振动器,需要VIBRATE权限

hasVibrator:检查硬件是否有振动器。如果硬件有振动器则返回true,否则返回false。

hasAmplitudeControl:检查振动器是否有振幅控制,如果硬件可以控制振动的幅度,则为true,否则为false。

vibrate(long milliseconds, int amplitude):创建一次性振动。(参数:milliseconds振动的时长,单位为毫秒;amplitude振动的强度。)

vibrate(long[] timings, int[] amplitudes, int repeat):创建波形振动,有振动强度的定义。(参数:timings指定手机以 timings 指定的模式振动,比如 timings 为 new int[200,400,600,800],就是让它在200,400,600,800 这个时间交替启动与关闭振动器;amplitude振动的强度;repeat是否重复震动,如果是 -1 的只振动一次,如果是 0 的话则一直振动)

vibrate(long[] timings, int repeat):创建波形振动,无振动强度的定义。(参数timings和repeat如上)

使用流程

1.获得Vibrator实例

通过getSystemService(Service.VIBRATOR_SERVICE)可获得Vibrator实例。

2.调用vibrator.hasVibrator()判断是否有振动器。

3.调用vibrator.hasAmplitudeControl() 判断是否可以设置振幅大小.

4.创建振动,可以选择上述的三个构造函数创建一次性振动或者波形振动,创建后开始振动

5.用完后可以调用vibrator.cancel()取消振动。

SensorManager

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

常用方法

SensorManager.getDefaultSensor():传入传感器类型即可得到相应的感应器。如陀螺仪(Sensor.TYPE_GYROSCOPE)、光线传感器(Sensor.TYPE_LIGHT)、加速传感器(Sensor.TYPE_ACCELEROMETER)等

SensorManager.registerListener():设置传感器监听SensorEventListener。需要传入三个参数——第一个参数为SensorEventListener的实例,第二个参数为Sensor的实例,第三个参数为传感器输出信息的更新速率(SENSOR_DELAY_UI 、SENSOR_DELAY_NORMAL 、SENSOR_DELAY_GAME 和SENSOR_DELAY_FASTEST四个值)。

更新速率参数详解

SENSOR_DELAY_UI:适合普通用户界面的频率。这种模式比较省电、而且系统开销也很小,但延迟较大,因此只适合在普通小程序中使用。

SENSOR_DELAY_NORMAL:正常频率。一般实时性要求不是特别高的应用上适合这种频率。

SENSOR_DELAY_GAME:适合游戏的频率。在一般实时性要求的应用上适合使用这种频率。

SENSOR_DELAY_FASTEST::最快。延迟最小,只有特别依赖于传感器数据的应用推荐采用这种频率,该种模式可能造成手机电量大量消耗,由于传递的为原始数据,算法不处理好将会影响应用的性能。

SensorManager.unregisterListener():注销传感器监听SensorEventListener,需要传入的参数为SensorEventListener的实例。

加速度传感器

Android 加速度传感器的类型是  Sensor.TYPE_ACCELEROMETER,加速度传感器在手机中应用非常的广泛,在开发的过程当中也较为简单。

加速度传感器又叫做G-sensor,返回x、y、z三轴的加速度数值,该数值包含地心引力的影响,单位是m/s^2。三个轴方向如图所示:

当手机静止竖直摆放,机头朝上。那么x,z轴均无加速度,y轴上会固定受到地球重力加速度的影响,因此y轴加速度为9.81m/s^2。

当手机静止竖直摆放,机头朝下。那么x,z轴均无加速度,y轴上会固定受到地球重力加速度的影响,因此y轴加速度为-9.81m/s^2。

x、y、z三个方向的加速度可分别通过SensorEvent.values[0]、SensorEvent.values[1]、SensorEvent.values[2]获得。

晃动取消闹钟功能

创建振动

创建设备的振动需要使用到Vibrator类,经过学习可知,使用Vibrator类首先需要获得权限,在AndroidManifest.xml文件中添加:

获得Vibrator传感器实例,调用getSystemService(this.VIBRATOR_SERVICE)获取

vibrate(long[] timings, int repeat)创建波形振动,可以设置振动的模式和是否重复。patter存储的是振动模式,设置振动在0,1000这两个时间交替启动与关闭振动器,并且振动重复。

注册传感器监听

在响铃Activity重新被启动时,要重新注册传感器,因此放在onResume()方法中。

通过调用SensorManager.registerListener()可以为传感器注册监听,传入的第一个参数为SensorEventListener的实例;第二个参数为Sensor的实例,调用SensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)获取到设备的加速传感器;第三个参数为传感器输出信息的更新速率。

监听传感器

ring类实现了SensorEventListener接口,因此需要实现onSensorChanged()方法,定义传感器变化时所要执行的操作。

首先需要获得变化的传感器的类型,便于后文的判断,也要获得传感器的value。

通过if语句判断变化的传感器是否为加速器(Sensor.TYPE_ACCELEROMETER),加速度传感器又叫做G-sensor,返回x、y、z三轴的加速度数值,该数值包含地心引力的影响,单位是m/s^2。

如果为加速传感器则float类型的values则存储加速器的x、y、z,values[0]表示x轴的加速度、values[1]表示y轴的加速度、values[2]表示z轴的加速度。

 

开发者的思路是,当手机静止时任意轴的加速度值最大在9.8-10之间(受重力加速度影响),所以当某一轴的加速度远大于10则代表晃动手机了。经过开发者测试,14是个合适的数值。

因此通过if语句,调用Math.abs()获得加速度的绝对值(正负方向对判断是否摇晃手机无影响),某一轴的数值>14,响铃页面标定摇晃次数的i(初始值为30)即可-1,并且调用自定义的changei()方法改变响铃页面标定摇晃次数。

changei()函数

nums为响铃页面标定摇晃次数的TextView,调用setText()方法将摇晃次数改为新的i值。

如果已经摇晃30次(if(i==0)),则调用函数finish()完成结束响铃Activity等操作。

 finish()函数

摇晃手机达到30次后,完成取消闹钟的要求,此时要结束响铃Activity,振动器也需要cancel,音乐也需要结束

所以当摇晃手机达到30次后调用vibrator.cancel()取消振动器,调用onDestroy()结束响铃这个Activity,再调用super.finish()结束音乐。

总结

"晃动取消app"是一个很有创意的app,为了让用户快速清醒,增加了摇晃取消闹钟的功能,较有趣味性并且能取得很好的效果。

此app有三个Activity,开发者较好地实现了Activity之间的交互,并且完成了设置闹钟、闹钟响铃、摇晃关闭闹钟这些功能,实现了闹钟的基本功能。

但美中不足的是只能设置一个闹钟,并且不能定义闹钟是每日响还是只响一次。我认为可以在主页面添加一个"+"号,通过点击"+"号跳转至设置闹钟的页面设置闹钟。还能在设置页面中添加一个”每日“的Switch按钮,通过判断用户是否选上Switch来设置是一次性闹钟还是重复闹钟。(set(int type,long startTime,PendingIntent pi)该方法用于设置一次性闹钟,setRepeating(int type,long startTime,long intervalTime,PendingIntent pi)该方法用于设置重复闹钟。)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值