抬手亮屏
来源:互联网 发布:暴雪什么游戏支持mac 编辑:程序博客网 时间:2024/04/28 17:52
原理:
分析抬手亮屏的过程,首先是抬手的动作,抬手的过程会产生一个加速度,然后是抬手后设备静止的状态,如果用户当前是想显示屏幕那么设备肯定处于一个接近水平的状态。有这两个过程基本可以确定用户是想点亮屏幕的。这两个过程的判断仅仅使用到加速度传感器,无须大部分设备会同时使用到的陀螺仪、磁力传感器等,对节省设备电量也有一定的帮助。
1.判断抬手的动作。首先介绍一下Android设备的自然方向,如下图所示:
对于典型的Android智能设备,当它平放在桌面上并且上部指向正北方时的方向就是其自然方向。传感器管理器可以报告所有三个坐标轴方向上的传感器变化。通过传感器事件监听器的传感器事件参数的values属性传入的值依次表示横向、纵向和垂直方向的加速度。我们可以设置一个大于9.8(重力加速度)的阈值,比如14,当三个方向有任何一个的值大于该阈值时判断用户抬手了。阈值设置得越大,用户触发此判断的抬手动作也需要越大。记录此时的时间,精确到毫秒。
2.判断用户查看设备的动作。可以知道设备处于水平方向时x轴和y轴的加速度为0,z轴加速度为9.8。因为我们抬手看设备的时候无法保证设备处于绝对水平的状态,所以应当适当放宽条件,比如:9 < z && -2 < x < 2&& -2 < y < 2。当设备满足此条件时判断用户是想查看设备的。记录此时的时间,精确到毫秒。
3.抬手亮屏。测试表明,抬手和查看设备这两个动作之间的时间间隔不会大于500毫秒,所以最后一步便是计算1和2所记录时间的差值,如果差值在500以内可以判断用户此次是抬手查看设备的动作,此时唤醒屏幕,并将1中的时间清零。如不清零在0.5秒的时间里设备是无法被熄屏的,这会对用户造成一定的困扰。
源码:
import android.app.Activity;import android.hardware.Sensor;import android.hardware.SensorEvent;import android.hardware.SensorEventListener;import android.hardware.SensorManager;import android.os.Bundle;import android.os.PowerManager;public class WakeLockActivity extends Activity { private SensorManager sensorManager; private PowerManager pm; private PowerManager.WakeLock mWakelock; private long shakeTime;//抬手时间 private long showTime;//平放手机时间 private Sensor accelerometer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_two); sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); pm = (PowerManager)getSystemService(POWER_SERVICE); mWakelock = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP |PowerManager.SCREEN_DIM_WAKE_LOCK, "WakeLock"); } @Override protected void onResume() { super.onResume(); if (accelerometer == null) { accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); sensorManager.registerListener(sensorEventListener, accelerometer, SensorManager.SENSOR_DELAY_UI); } } //重力感应监听 private SensorEventListener sensorEventListener = new SensorEventListener() { @Override public void onSensorChanged(SensorEvent event) { float[] values = event.values; float x = values[0]; // x轴方向的重力加速度,向右为正 float y = values[1]; // y轴方向的重力加速度,向前为正 float z = values[2]; // z轴方向的重力加速度,向上为正 int medumValue = 14; //判断是否抬手 if (Math.abs(x) > medumValue || Math.abs(y) > medumValue || Math.abs(z) > medumValue) { shakeTime = System.currentTimeMillis(); } //判断是否平放手机 if(9 < z && -2 < x && x < 2 && -2 < y && y < 2){ showTime = System.currentTimeMillis(); if(0 < showTime - shakeTime && showTime - shakeTime < 500){ shakeTime = 0; mWakelock.acquire(); mWakelock.release(); } } } @Override public void onAccuracyChanged(Sensor arg0, int arg1) { } }; @Override protected void onDestroy() { super.onDestroy(); sensorManager.unregisterListener(sensorEventListener); }}这里对mWakelock.release()作一下说明,该方法并不是熄屏,而是释放亮屏的锁,也就是说如果没有释放的话设备会一直处于亮屏状态。
记得添加权限:
<uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission>
- 抬手亮屏
- Android抬手亮屏
- 公车上的瑜伽(三:抬手)
- cell选中变色,抬手颜色恢复
- Android 保持亮屏
- 亮屏时间分析
- Android亮屏和熄屏控制
- Android亮屏和熄屏控制
- Android亮屏和熄屏控制
- Android亮屏和熄屏控制
- Android亮屏和熄屏控制
- Android亮屏和熄屏控制
- Android亮屏和熄屏控制
- Android亮屏和熄屏控制
- 锁屏和亮屏控制
- Android亮屏和熄屏控制
- Android息屏与亮屏
- android亮屏解锁demo
- 小回顾-累加算法
- 图像感兴趣区域ROI获取的正确方式
- 项目中 .net framework (v4.0 ->v3.5)降级引发的问题及解决方案
- c.hashMap源码解析(1.7)
- struts2页面传值问题,对象List,iterator迭代,s:标签
- 抬手亮屏
- 数组学习
- java中JSON对象字符串排序问题
- error: cannot find /opt/ros/hydro/lib/liborocos-kdl.so.1.2
- 子元素的margin-top属性传递给父元素的问题
- PHP底层探索(五):Zend引擎简介
- 内存优化之设置图片显示所有方法对比
- PCM编码
- 教你拿出appStore应用中app中的图片资源