android悬浮窗口 图书,FloatWindow-优雅实现Android悬浮窗

研究并写了一套悬浮窗实现方案,缩放,移动,关闭,点击,自定义某个页面显示,我采用的是内部view添加布局展示悬浮窗,此方案在线上稳定运行,可根据需要自行修改。

About FloatWindow

Android APP中实现悬浮窗的场景很多,比如悬浮窗播放视频,离开直播间,或者退出应用,继续播放直播流等。本项目在线上稳定运行,仅供参考,可根据自己的需求,改进,欢迎交流。

a3414ae63a7c

float-window-no-permission-1.png

悬浮窗的实现方式

一,Window Manager实现

通常的做法是使用WindowManager,使用其addView方法,添加一个布局view来实现系统弹窗,大部分window type需要申请权限,如果是 TYPE_SYSTEM_ALERT 形式,需要申请以下权限:

android.permission.SYSTEM_ALERT_WINDOW

该方式,既可以在app内部显示,也可以在应用外也显示,缺点是有兼容性问题,需要做ROM适配,而且因为更新布局迟钝,不适合对悬浮窗做缩放操作,本项目有该方案的具体实现,具体参照demo。

悬浮窗主要是通过WindowManager这个类实现的,这个类有3个方法:

void addView (View view, WindowManager.LayoutParams params)//添加一个悬浮窗

void removeView (View view)//移除悬浮窗

void updateViewLayout (View view, WindowManager.LayoutParams params)//更新悬浮窗参数

以下是部分代码:

/**

* 利用系统弹窗实现悬浮窗

*

* @param mContext

*/

private void initSystemWindow(Context mContext) {

windowManager = SystemUtils.getWindowManager(mContext);

WindowManager.LayoutParams wmParams = new WindowManager.LayoutParams();

wmParams.packageName = mContext.getPackageName();

wmParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL

| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON

| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE

| WindowManager.LayoutParams.FLAG_SCALED

| WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR

| WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;

if (float_window_type == FLOAT_WINDOW_TYPE_DIALOG) {

//wmParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG;

wmParams.type = WindowManager.LayoutParams.TYPE_TOAST;

} else if (float_window_type == FLOAT_WINDOW_TYPE_ALERT_WINDOW) {

//需要权限

wmParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;

}

wmParams.format = PixelFormat.RGBA_8888;

wmParams.gravity = Gravity.START | Gravity.TOP;

wmParams.width = floatViewParams.width;

wmParams.height = floatViewParams.height;

wmParams.x = floatViewParams.x;

wmParams.y = floatViewParams.y;

floatView = new FloatWindowView(mContext, floatViewParams, wmParams);

windowManager.addView((View) floatView, wmParams);

}

a3414ae63a7c

float-window-app-system.png

二,顶级view添加悬浮窗

demo中还提供了另外一种优雅的实现方式,无需申请权限,任意界面都可以显示悬浮窗,此弹窗,无需申请权限,可以拖动,缩放,关闭,点击,没有兼容性问题,限于app内部,可以在BaseActivity中注入。

/**

* 直接在activity根布局添加悬浮窗

*

* @param mContext

*/

private void initCommonFloatView(Context mContext) {

floatView = new FloatView(mContext, floatViewParams);

View rootView = activity.getWindow().getDecorView().getRootView();

contentView = (FrameLayout) rootView.findViewById(android.R.id.content);

contentView.addView((View) floatView);

}

基本上可以满足大部分的需要,仅供参考。

a3414ae63a7c

float-window-system-permission.png

详细代码,请移步我的Github,请star一下表示支持噢:

Android-FloatWindow

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于 Android 浮窗广告的实现,需要用到 AndroidWindowManager 类,下面是一个简单的实现方式: 1. 在 AndroidManifest.xml 文件中添加权限: ``` <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> ``` 2. 创建一个悬浮窗的布局文件,例如 float_window.xml: ```xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/float_layout" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@android:color/transparent" android:orientation="vertical"> <!-- 在这里添加你的广告布局 --> </LinearLayout> ``` 3. 创建一个 Service 类用于控制悬浮窗的显示和隐藏: ```java public class FloatWindowService extends Service { private WindowManager windowManager; private LinearLayout floatLayout; private WindowManager.LayoutParams params; @Override public void onCreate() { super.onCreate(); windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); // 设置悬浮窗的布局参数 params = new WindowManager.LayoutParams( WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT); // 设置悬浮窗的位置 params.gravity = Gravity.TOP | Gravity.LEFT; params.x = 0; params.y = 0; // 加载悬浮窗的布局文件 LayoutInflater inflater = LayoutInflater.from(this); floatLayout = (LinearLayout) inflater.inflate(R.layout.float_window, null); // 在这里添加你的广告布局 // 将悬浮窗添加到 WindowManager 中 windowManager.addView(floatLayout, params); } @Override public void onDestroy() { super.onDestroy(); // 在 Service 销毁时移除悬浮窗 if (floatLayout != null) { windowManager.removeView(floatLayout); } } @Nullable @Override public IBinder onBind(Intent intent) { return null; } } ``` 4. 在需要显示悬浮窗的地方启动 Service: ```java startService(new Intent(this, FloatWindowService.class)); ``` 这样就可以实现一个简单的 Android 浮窗广告了。当然,你也可以根据自己的需求对悬浮窗进行更加复杂的实现

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值