屏幕方向使底部按钮消失

Screen orientation made bottom buttons disappear

底部导航按钮有一个非常奇怪的问题。由于我们不知道的原因,我们的设备在设备属性列表中设置了 ro.sf.hwrotation=270。使用此设置,一切都按预期在纵向模式下工作(启动 logo/animation、系统活动、我们的应用程序,...)。不起作用的是 Miracast 显示器,正如您可能已经猜到的那样,它旋转不正确。

所以我决定更仔细地研究它,并在第一步将 属性 更改为 ro.sf.hwrotation=0。幸运的是,这已经解决了 Miracast 问题,所有系统活动仍然是纵向的,我们的应用程序也一样,除了这个奇怪的问题:

按钮不见了。再次旋转到横向时,除了按钮(现在甚至卡在右侧)之外,一切都应该如此:

有人可以告诉我在哪里看吗?我在日志中看不到任何可疑的东西,没有崩溃或异常。

很可能按钮也以某种方式奇怪地旋转,但话又说回来,为什么只有按钮?他们有什么特别之处吗?如果我还原设置,一切都会恢复正常。

虽然这不是一个通用的解决方案,但它可能对将来的某些人有所帮助:我们的设备不仅调整了旋转设置,还调整了 ro.sf.lcd_density(从 160 更改为 188)。

在试验过程中,我注意到概览(最近的应用程序)按钮仍然可以正常使用,只是很难触及(而且不可见)。所以按钮在那里。

经过另一轮实验后,我注意到密度设置发生了无害的变化 - 你猜怎么着,在将值恢复为 160 后它再次起作用了!出于某种原因,我们以这种方式降低了 LCD 的 width/height。

当然,这是有代价的——现在我们提高了 LCD 分辨率,设备显示的按钮多了一个,甚至顺序不同了。

无意间,当我准备开始接受不同的 DPI/button 安排时,我发现了这个 post:https://community.nxp.com/thread/384348#comment-831065。作者只处理显示器的一侧,所以这是一个可以处理所有四个显示器的版本:

--- a/android4.2/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
+++ b/android4.2/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
@@ -415,7 +415,20 @@ public class NavigationBarView extends LinearLayout {
         for (int i=0; i<4; i++) {
             mRotatedViews[i].setVisibility(View.GONE);
         }
-        mCurrentView = mRotatedViews[rot];
+        //mCurrentView = mRotatedViews[rot];
+
+        if (rot == Surface.ROTATION_0 && mVertical) {
+            mCurrentView = mRotatedViews[Surface.ROTATION_90];
+        } else if (rot == Surface.ROTATION_90 && !mVertical) {
+            mCurrentView = mRotatedViews[Surface.ROTATION_180];
+        } else if (rot == Surface.ROTATION_180 && mVertical) {
+            mCurrentView = mRotatedViews[Surface.ROTATION_270];
+        } else if (rot == Surface.ROTATION_270 && !mVertical) {
+            mCurrentView = mRotatedViews[Surface.ROTATION_0];
+        } else {
+            mCurrentView = mRotatedViews[rot];
+        }
+
         mCurrentView.setVisibility(View.VISIBLE);

         mDeadZone = (DeadZone) mCurrentView.findViewById(R.id.deadzone);

应用此补丁后,我终于有了一个好的解决方案 - DPI 不变(即 188),按钮可见,HDMI 固定,一切正常。