赞
踩
2021SC@SDUSC
前面文章主要分析了“晃动取消闹钟”的页面布局、设置/取消闹钟、响铃功能,这篇文章主要分析晃动取消响铃功能。
目录
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 是系统所有传感器的管理器,有了它的实例之后就可以调用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)该方法用于设置重复闹钟。)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。