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

omqzjyyz  于 2023-04-18  发布在  Android
关注(0)|答案(2)|浏览(154)

我需要一个视图显示在我的应用程序的顶部,当它显示时,它可以继续显示在我的应用程序的所有其他视图(所有片段和活动)的顶部。它听起来像一个浮动操作按钮,但将始终显示在我的应用程序的顶部。
我知道我可以通过添加视图到我的手机的WindowManager来做到这一点,当我退出应用程序时隐藏它,当我恢复应用程序时再次显示它。这种棘手的方法可以工作,但它也需要一些额外的权限,这是我试图避免的。
如果我只想在我的应用程序中显示,我可以在不要求用户额外权限的情况下实现它吗?如果答案是肯定的,那么怎么做?关键似乎是视图的一些LayoutParams,我尝试过,但失败了。
如果答案能显示一些详细的代码和解释就更好了。

yeotifhr

yeotifhr1#

为此,必须使用WindowManager
首先在清单中添加权限

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

添加要显示的图像。

chatheadImg = (ImageView)chatheadView.findViewById(R.id.chathead_img);

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

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;

并仅在视图上注册触摸事件

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;

});

查看这些教程以更好地理解
http://www.androidhive.info/2016/11/android-floating-widget-like-facebook-chat-head/
https://github.com/henrychuangtw/Android-ChatHead

zujrkrfu

zujrkrfu2#

在清单中添加此权限

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

然后加上这段代码

windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
        LayoutInflater layoutInflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        layoutView = layoutInflater.inflate(R.layout.ringing_layout, null);
    phoneTv = layoutView.findViewById(R.id.phone);

    Log.d("TAG", "showLayout: " + phoneTv );
    p = new WindowManager.LayoutParams(
            // Shrink the window to wrap the content rather than filling the screen
            600, 600,
            WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                    | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED,
            PixelFormat.TRANSLUCENT);
    layoutView.findViewById(R.id.close).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            windowManager.removeView(layoutView);
        }
    });
    p.gravity = Gravity.CENTER | Gravity.CENTER;
    p.x = 0;
    p.y = 0;
    windowManager.addView(layoutView, p);
    Log.d("TAG", "showLayout: ");

相关问题