我今天看到了一个覆盖整个屏幕的应用程序,包括导航栏(或带有后台,家庭等的软键)。它是CF.Lumen(需要android 4.4+)by chainfire。
我只记得这在一般方法上是不可能的,许多SO答案告诉我。所以我从Lumens apk(抱歉的链火)查看了smali代码,发现0x7d6
为类型说明符,即TYPE_SYSTEM_OVERLAY
。
通常,这会使锁定屏幕顶部的视图叠加。它看起来不错,但它不会覆盖导航栏区域。甚至在锁屏上。
我确实将MATCH_PARENT
替换为9999
,但它仍然不会覆盖导航条区域。
我查看了Android的源代码,发现有趣的是有更多未记录的类型。
FIRST_SYSTEM_WINDOW = 2000;
TYPE_NAVIGATION_BAR = FIRST_SYSTEM_WINDOW + 19;
TYPE_BOOT_PROGRESS = FIRST_SYSTEM_WINDOW + 21;
我将这些应用到我的应用程序但得到了crashe说许可被拒绝。它需要INTERNAL_SYSTEM_WINDOW
或者比SYSTEM_ALERT_WINDOW
更无文档的东西。这些权限仅授予系统应用程序。
这里添加视图的代码填充整个屏幕,除了导航栏区域。
我该怎么做才能完成它?(制作叠加包括导航栏区域)
final WindowManager.LayoutParams paramsRL = new WindowManager.LayoutParams(
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
WindowManager.LayoutParams.FLAG_FULLSCREEN
| WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
| WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
PixelFormat.TRANSLUCENT);
windowManager.addView(view_floating, paramsRL);
答案 0 :(得分:2)
这是一个有效的小例子:
FrameLayout frameLayout = new FrameLayout(context);
frameLayout.setBackgroundColor(Color.BLACK);
frameLayout.setAlpha(0.5f);
windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED
| WindowManager.LayoutParams.FLAG_FULLSCREEN
| WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
PixelFormat.TRANSLUCENT);
//make sure height includes the nav bar size (get the dimension of whole screen)
params.height = screenHeight;
params.width = screenWidth;
windowManager.addView(frameLayout, params);
//add your view to this frameLayout
frameLayout.addView(....);
这里有三个关键的事情:
TYPE_SYSTEM_OVERLAY(或任何类似的类型),可以在整个屏幕上显示内容。
FLAG_LAYOUT_NO_LIMITS,可让我们超越正常尺码。
设置软键后面需要的额外高度。主要问题是当我们将参数设置为match_parent时,它设置为屏幕高度减去导航栏我想。设置额外高度可以解决问题。
答案 1 :(得分:0)
请勿使用WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,此标志将使导航栏始终显示。我不知道为什么。