Android  Windows悬浮窗

最近在工作中 正好在做悬浮窗的相关功能, 所以正好记录以下:

在Android中 有一种View 是覆盖在所有的Activity fragment上显示的,
那就是Window  就是我们经常看到个中app 的悬浮窗.

其实想再Window上显示View 很简单的:
1. 获取 WindowsManager
2. 初始化View 以及 相关的 WindowManager.LayoutParams()
3. 把View 添加到Window上
 mWindowManager.addView(View, ViewParams);
 mWindowManager.removeView(View);

需要注意的是, WindowManager.LayoutParams()
这里的配置项有点多
可以参考下下面这片文章上的一些讲解:

下面给出一个 简单的配置: 

WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();
layoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
layoutParams.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE;
layoutParams.format = PixelFormat.TRANSPARENT;
layoutParams.width = WindowManager.LayoutParams.MATCH_PARENT;
layoutParams.height = WindowManager.LayoutParams.MATCH_PARENT;
layoutParams.gravity = Gravity.TOP;
layoutParams.flags = WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED;

// 让键盘自适应 需要加入以下内容
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    layoutParams.systemUiVisibility =
            View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
}

对了上面的代码有提到一点就是 键盘自适应的问题,
在Window上让键盘自适应 有一个问题, 就是 他会把整个Window 都往上移动,
在左锁屏这类的app时, 碰到输入框需要注意.
还有一个就是 键盘与 EditText 自适应的问题, 
经过测试发现在 4.4 以上的手机 必须 设置 layoutParams.systemUiVisibility =View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
这样键盘弹出来时, EditText 也会自动上移

下面在说一说关于 那种可以在Window上可以移动的 那种 小悬浮窗 是如何实现的,  
WindowParams = new WindowManager.LayoutParams();
int mMargin = mMarginLeft = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10, getContext().getResources().getDisplayMetrics());
mMarginTop = mStatusBarHeight + mMargin;
mMarginRight = mScreenWidth - mBubbleEdgeSizeWidth - mMargin;
mMarginBottom = mScreenHeight - mBubbleEdgeSizeHeight - mMargin;

mWindowParams.x = mMarginRight;
mWindowParams.y = mMarginBottom;

mWindowParams.type = WindowManager.LayoutParams.TYPE_PHONE;
mWindowParams.format = PixelFormat.RGBA_8888;
mWindowParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
        | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
        | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
mWindowParams.gravity = Gravity.LEFT | Gravity.TOP;
mWindowParams.width = mBubbleEdgeSizeWidth;
mWindowParams.height = mBubbleEdgeSizeHeight;
上面就是一个小悬浮窗的基本 layoutParams
需要注意的是,  mWindowParams.x, mWindowParams.y 还有mWindowParams.width,mWindowParams.height
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
        | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
这样就可以 将不点在 小悬浮窗 事件透过去, 本层Window不处理

mWindowParams.width,mWindowParams.height 给的都是 小悬浮球的view 的大小
mWindowParams.x, mWindowParams.y 表示这个小悬浮球view 在window 上的位置

我在移动小悬浮球View 的时候 监听到 onTouch方法, 然后获取event.getRawX(),event.getRawY() 获取在屏幕上的出门的位置, 然后经过一些简单计算,
最后吧值赋给 mWindowParams.x, mWindowParams.y, 如下 
mWindowParams.x = x;
mWindowParams.y = y;

LogUtil.d(TAG, "x = " + x + ", y = " + y);
if (mWindowManager != null && isAttachedToWindow()) {
    mWindowManager.updateViewLayout(this, mWindowParams);
}

这样就基本实现了VIew 的简单移动

下面说一说如果知识向在Window上显示而不获取任何点击事件:
可以使用下面设置: 
layoutParams.flags = WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED
        | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
        | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;

更多的设置项 还是需要 熟悉 相关文档:







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java是一种面向对象的编程语言,而Android Studio是一款用于开发Android应用程序的集成开发环境。悬浮窗是一种可以在屏幕上悬浮显示的窗口,通常用于实现一些常驻的功能或者提醒。在Android应用程序中,可以通过使用悬浮窗来实现一些常驻的功能或者提醒,比如音乐播放器的悬浮窗、消息提醒的悬浮窗等等。 要实现Android应用程序中的悬浮窗,可以使用Android提供的WindowManager类。具体来说,可以通过以下步骤来实现: 1. 在AndroidManifest.xml文件中添加SYSTEM_ALERT_WINDOW权限。 2. 创建一个Service,并在其中创建一个悬浮窗View。 3. 在Service中使用WindowManager.addView()方法将悬浮窗View添加WindowManager中。 4. 在Service中使用WindowManager.removeView()方法将悬浮窗ViewWindowManager中移除。 下面是一个简单的示例代码,用于在Android应用程序中实现一个悬浮窗: ``` public class FloatingWindowService extends Service { private WindowManager mWindowManager; private View mFloatingView; public FloatingWindowService() { } @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { super.onCreate(); // 创建一个悬浮窗View mFloatingView = LayoutInflater.from(this).inflate(R.layout.floating_window, null); // 设置悬浮窗View的参数 WindowManager.LayoutParams params = new WindowManager.LayoutParams( WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT); // 获取WindowManager mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE); // 将悬浮窗View添加WindowManager中 mWindowManager.addView(mFloatingView, params); } @Override public void onDestroy() { super.onDestroy(); // 将悬浮窗ViewWindowManager中移除 mWindowManager.removeView(mFloatingView); } } ``` 需要注意的是,由于Android 8.0及以上版本对悬浮窗权限进行了限制,因此在这些版本中需要使用TYPE_APPLICATION_OVERLAY类型的WindowManager.LayoutParams来创建悬浮窗。另外,为了保证悬浮窗的显示效果,建议在悬浮窗View中使用透明背景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值