长按menu按键旋转屏幕方向

 有个功能,通过长按menu按键,可以旋转屏幕方向(0°或者90°),这个功能有时蛮有用的,下面来看看是如何实现的:

  1 修改按键处理程序

  frameworks/policies/base/phone/com/android/internal/policy/impl/PhoneWindowManager.java
   boolean mSearchKeyPressed;
    boolean mConsumeSearchKeyUp;
//added by jhk
int mRot;
boolean MenuKeyUp  = true;

    // support for activating the lock screen while the screen is on
    boolean mAllowLockscreenWhenOn;

    int mLockScreenTimeout;


       函数

java代码:
  1. public boolean interceptKeyTi(WindowState win, int code, int metaKeys, boolean down,int repeatCount, int flags)

  2. //在处理菜单键的地方

  3. if (code == KeyEvent.KEYCODE_MENU) {
  4. final int chordBug = KeyEvent.META_SHIFT_ON;

  5. if (down && repeatCount == 0) {
  6. if (mEnableShiftMenuBugReports && (metaKeys & chordBug) == chordBug) {
  7. Intent intent = new Intent(Intent.ACTION_BUG_REPORT);
  8. mContext.sendOrderedBroadcast(intent, null);
  9. return true;
  10. } else if (SHOW_PROCESSES_ON_ALT_MENU &&(metaKeys & KeyEvent.META_ALT_ON) == KeyEvent.META_ALT_ON) {

  11. Intent service = new Intent();
  12. service.setClassName(mContext, "com.android.server.LoadAverageService");
  13. ContentResolver res = mContext.getContentResolver();
  14. boolean shown = Settings.System.getInt(res, Settings.System.SHOW_PROCESSES, 0) != 0;

  15. if (!shown) {
  16. mContext.startService(service);
  17. } else {
  18. mContext.stopService(service);
  19. }

  20. Settings.System.putInt(res, Settings.System.SHOW_PROCESSES, shown ? 0 : 1);
  21. return true;
  22. }

  23. }

  24. //上面是原来的内容,下面是添加的新内容
  25. else if (down && repeatCount == 20 && MenuKeyUp && (!keyguardOn)) {

  26. //如果按下Menu键一定时间,抬起时执行此段函数

  27. MenuKeyUp = false;
  28. try {
  29. int ro = mWindowManager.getRotation(); //获取当前方向
  30. if( ro == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE ) {
  31. ro = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
复制代码
java代码:
  1. } else {
  2. ro = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
  3. }
  4. }catch (RemoteException e) {

  5. Log.v(TAG, "!!! getRotation fail !!!");
  6. }

  7. try {
  8. //旋转屏幕
  9. mWindowManager.setRotation(ro, true, Surface.FLAGS_ORIENTATION_ANIMATION_DISABLE);
  10. //最后可跟不同的参数,可实现一些旋转效果
  11. }

  12. catch (RemoteException e) {
  13. Log.v(TAG, "!!! mWindowManager.setRotation fail !!!");
  14. }

  15. return true;
  16. }

  17. if(!down) {
  18. MenuKeyUp = true;
  19. }

  20. }
复制代码
2 修改实现选择的函数

java代码:
  1. /frameworks/base/services/java/com/android/server/WindowManagerService.java
  2. //找到该函数
  3. public boolean setRotationUncheckedLocked(int rotation, int animFlags)
  4. //将以下妨碍选择的内容注释掉
  5. //rotation = mPolicy.rotationForOrientationLw(mForcedAppOrientation,
  6. // mRotation, mDisplayEnabled);
复制代码
3、当然也可以新作一个rotate键来选择屏幕,以下是引用代码

java代码:
  1. } else if (code == KeyEvent.KEYCODE_ROTATE) {
  2. // ROTATE KEY pressed


  3. if (down) {
  4. mButtonPushFlg = true;
  5. try {
  6. int ro = mWindowManager.getRotation(); // Orientation vertical
  7. if (ro == 3 ) {

  8. mWindowManager.setRotation (Surface.ROTATION_0,true,mFancyRotationAnimation); 
  9. //Orientation landscape

  10. } else {
  11. mWindowManager.setRotation(Surface.ROTATION_270,true,mFancyRotationAnimation); 
  12. //Orientation portlate

  13. }
  14. } catch (RemoteException e) {
  15. // Igbore
  16. Log.i("info", "Rotation failed ");
  17. }
  18. }
  19. return true;
  20. }
复制代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值