Android 虚拟按键 触感 调用流程

PhoneWindowManager.java

intercept :拦截的意思

  1. public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags, boolean isScreenOn) {   
  2.   
  3.         if (down && (policyFlags & WindowManagerPolicy.FLAG_VIRTUAL) != 0   
  4.                 && event.getRepeatCount() == 0) {   
  5.             performHapticFeedbackLw(null, HapticFeedbackConstants.VIRTUAL_KEY, false);  
  6.         }      



  1. public boolean performHapticFeedbackLw(WindowState win, int effectId, boolean always) {  
  2.     Log.e("++++++++++++++++++++++""++++++++++performHapticFeedbackLw PhoneWindowManager.java");  
  3.     final boolean hapticsDisabled = Settings.System.getInt(mContext.getContentResolver(),  
  4.             Settings.System.HAPTIC_FEEDBACK_ENABLED, 0) == 0;  
  5.     if (!always && (hapticsDisabled || mKeyguardMediator.isShowingAndNotHidden())) {  
  6.         return false;  
  7.     }  
  8.     long[] pattern = null;  
  9.     switch (effectId) {  
  10.         case HapticFeedbackConstants.LONG_PRESS:  
  11.             pattern = mLongPressVibePattern;  
  12.             break;  
  13.         case HapticFeedbackConstants.VIRTUAL_KEY:  
  14.             pattern = mVirtualKeyVibePattern;  
  15.             break;  
  16.         case HapticFeedbackConstants.KEYBOARD_TAP:  
  17.             pattern = mKeyboardTapVibePattern;  
  18.             break;  
  19.         case HapticFeedbackConstants.SAFE_MODE_DISABLED:  
  20.             pattern = mSafeModeDisabledVibePattern;  
  21.             break;  
  22.         case HapticFeedbackConstants.SAFE_MODE_ENABLED:  
  23.             pattern = mSafeModeEnabledVibePattern;  
  24.             break;  
  25.         default:  
  26.             return false;  
  27.     }  
  28.     if (pattern.length == 1) {  
  29.         // One-shot vibration  
  30.         mVibrator.vibrate(pattern[0]);  
  31.     } else {  
  32.         // Pattern vibration  
  33.         mVibrator.vibrate(pattern, -1);  
  34.     }  
  35.     return true;  
  36. }  

其实还有其他的地方会用到振动,但是他们有自己的performHapticFeedback函数。比如:

View.java (这个会在长按桌面,图标时振动)

  1. public boolean performHapticFeedback(int feedbackConstant, int flags) {  
  2.     if (mAttachInfo == null) {  
  3.         return false;  
  4.     }       
  5.     //noinspection SimplifiableIfStatement  
  6.     if ((flags & HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING) == 0  
  7.             && !isHapticFeedbackEnabled()) {  
  8.         return false;  
  9.     }       
  10.     return mAttachInfo.mRootCallbacks.performHapticFeedback(feedbackConstant,  
  11.             (flags & HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING) != 0);  
  12. }  


Android4.0上的虚拟的键也是通过他调用的振动。可以看KeyButtonView.java,他就是继承的View。
好像这个是通过Session.java调用了PhoneWindowManager.java的performHapticFeedbackLw()。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值