在状态栏上方显示视图?
Posted
技术标签:
【中文标题】在状态栏上方显示视图?【英文标题】:Display view above status bar? 【发布时间】:2012-04-06 15:18:23 【问题描述】:我最近看到了一个应用程序的图像,它能够在状态栏上方显示一个视图,并且还能够用一个视图覆盖它。
我知道您可以从带有 align parent top 的视图中获得状态栏正下方的视图。但是如何在状态栏顶部获得视图??
Example
【问题讨论】:
任何指向图像的链接以弄清楚您在说什么? 你在说play.google.com/store/apps/… 没错。单击示例以查看图像示例。无论如何,我不知道你甚至可以做到这一点。我认为状态栏是最重要的,如果你愿意,它只能隐藏 【参考方案1】:禁用系统状态栏 - 没有 Root
经过整整两天搜索 SO 帖子并一遍又一遍地阅读 android 文档。这是我想出的解决方案。 (已测试)
mView= new TextView(this);
mView.setText(".........................................................................");
mLP = new WindowManager.LayoutParams(
WindowManager.LayoutParams.MATCH_PARENT,
100,
// Allows the view to be on top of the StatusBar
WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
// Keeps the button presses from going to the background window
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
// Enables the notification to recieve touch events
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
// Draws over status bar
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
PixelFormat.TRANSLUCENT);
mLP.gravity = Gravity.TOP|Gravity.CENTER;
mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
mWindowManager.addView(mView, mLP);
不要忘记权限:
<uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" />
注意: 测试到 kitkat。
【讨论】:
WindowManager 应该像这样 getApplicationContext().getSystemService(Context.WINDOW_SERVICE); 也需要这个权限@Sadeshkumar 的回答对于 ICS 及更高版本(也许 GB 也是)不正确。
使用TYPE_SYSTEM_ALERT
和FLAG_LAYOUT_IN_SCREEN
创建的视图被StatusBar
覆盖。
要在StatusBar
上叠加,您需要使用TYPE_SYSTEM_OVERLAY
而不是TYPE_SYSTEM_ALERT
。
那么问题来了,如何获得点击/触摸?
【讨论】:
有没有办法使用系统覆盖来获取触摸事件?【参考方案3】:使用TYPE_SYSTEM_ERROR
和FLAG_LAYOUT_IN_SCREEN
创建的视图被StatusBar
覆盖。
【讨论】:
和 TYPE_SYSTEM_ERROR + FLAG_LAYOUT_IN_SCREEN 将是可触摸的。【参考方案4】: int statusBarHeight = (int) Math.ceil(25 * getResources().getDisplayMetrics().density);
View statusBarView = new View(MyActivity.this);
statusBarView.setBackgroundColor(Color.GREEN);
WindowManager.LayoutParams params = null;
params = new WindowManager.LayoutParams(WindowManager.LayoutParams.FILL_PARENT,statusBarHeight,WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN, PixelFormat.TRANSLUCENT);
params.gravity = Gravity.RIGHT | Gravity.TOP;
WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
wm.addView(statusBarView, params);
【讨论】:
以上是关于在状态栏上方显示视图?的主要内容,如果未能解决你的问题,请参考以下文章