热门内容

公众号"MAKE1"

获取行业最新资讯

请扫码添加

专业客服企业微信

Android 虚拟按键 触感 调用流程

简介

Android 虚拟按键 触感 调用流程

PhoneWindowManager.java

  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()。

0
 条评论
相关内容推荐