Android:如何将视图添加到 WindowManager,并使其始终悬浮在我的应用程序顶部?

Ant*_*eef 4 android window-managers view

我需要一个视图显示在我的应用程序的顶部,当它显示时,它可以继续显示在我所有应用程序的其他视图(所有片段和活动)的顶部。这听起来像一个浮动操作按钮,但会始终显示在我的应用程序的顶部。

我知道我可以通过向手机的 WindowManager 添加视图来实现,并在退出应用程序时隐藏它,在恢复应用程序时再次显示它。这种棘手的方法可以工作,但它也需要一些额外的许可,这是我试图避免的。

如果我只想在我的应用程序中显示,我可以在不征得用户额外许可的情况下实现吗?如果答案是肯定的,那么如何呢?关键似乎是视图的一些 LayoutParams,我尝试过但失败了。

如果答案可以显示一些详细的代码和解释,那就太好了。

Abd*_*wee 5

为此,您必须使用 WindowManager

首先在清单中添加权限

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
Run Code Online (Sandbox Code Playgroud)

添加要显示的图像。

chatheadImg = (ImageView)chatheadView.findViewById(R.id.chathead_img);
Run Code Online (Sandbox Code Playgroud)

然后创建服务并向其添加窗口管理器。

WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.TYPE_PHONE,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
            PixelFormat.TRANSLUCENT);
    params.gravity = Gravity.TOP | Gravity.LEFT;
    params.x = 0;
    params.y = 100;
Run Code Online (Sandbox Code Playgroud)

只需在视图中注册触摸事件

chatheadView.setOnTouchListener(new View.OnTouchListener() {
@Override
        public boolean onTouch(View v, MotionEvent event) {
        Switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:

                      //To do
                    break;
                case MotionEvent.ACTION_MOVE:

                break;

});
Run Code Online (Sandbox Code Playgroud)

检查这些教程以更好地理解

http://www.androidhive.info/2016/11/android-floating-widget-like-facebook-chat-head/

https://github.com/henrychuangtw/Android-ChatHead

  • 感谢您的回答,但我真的不想征求我的用户的许可。未经此许可的任何方式将不胜感激。 (3认同)