长按按键后在抬起up后响应事件。短按键亮灭屏。

长按按键后在抬起up后响应事件 :

适用于长按触发没说长按多少秒,那么我们就在抬起的时候触发,如果说了具体时间,需要长按的过程就触发,就做个handler延迟

frameworksbase/services/core/java/com/android/server/policy/PhoneWindowManager.java

对应的键的case

if(down){下加入计入初始时间

mDownTime = event.getEventTime();

这个mDownTime之前要记得定义

private long mDownTime;

if(event.getAction() == KeyEvent.ACTION_UP){

或者直接就是else{

加入判断

if(event.getEventTime() - mDownTime >= 1000){

就是超过一秒钟长按就是算能触发,然后执行相应事件就行

任意键短按亮灭屏,这里以camera键为例,短按亮灭屏,长按进入相机

frameworksbase/services/core/java/com/android/server/policy/PhoneWindowManager.java

亮屏:

PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.SCREEN_DIM_WAKE_LOCK,"bright");boolean isScreenOn = pm.isScreenOn();wl.acquire();wl.release();

可以判断当前是否亮屏,来取决到底亮还是灭

  

灭屏的方法用里面就有的

goToSleep(SystemClock.uptimeMillis(), PowerManager.GO_TO_SLEEP_REASON_LID_SWITCH,PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE);

其实这个方法

goToSleep(long eventTime, int reason, int flags) {

所以第二个参数其实也没啥用,就说下为啥

源码还有用到的是

goToSleep(event.getEventTime(),PowerManager.GO_TO_SLEEP_REASON_POWER_BUTTON, 0);

所以这个reason是对的,所以可以改为

goToSleep(SystemClock.uptimeMillis(), PowerManager.GO_TO_SLEEP_REASON_POWER_BUTTON, 0);

SystemClock.uptimeMillis() // 从开机到现在的毫秒数(手机睡眠的时间不包括在内);
System.currentTimeMillis() // 197011 UTC到现在的毫秒数;

@param eventTime 时间

 * @param reason 原因,Power键灭屏则是PowerManager.GO_TO_SLEEP_REASON_POWER_BUTTON

 * @param flags 目前只有两个值:01(GO_TO_SLEEP_FLAG_NO_DOZE)

如果除了亮灭屏还有长按,那就不能放在down的判断下,down就记录一个时间就行

if(down){mDownTime = event.getEventTime();}

剩下的操作都放在up里面执行就行

if(event.getAction() == KeyEvent.ACTION_UP){if(!isScreenOn){

都放在down里的话,长按就得先息屏后调用了


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部