浮动窗口(Android)
来源:互联网 发布:淘宝网涂料 编辑:程序博客网 时间:2024/05/10 12:44
浮动页面的需求是:通过直接的函数调用,在当前页面之上显示一个类似的广告页面。
1、WindowManager
搜索网上大多都是基于WindowManager:WindowManager是全局的,整个系统只有一个WindowManager。它是显示View的最底层。WindowManager主要用来管理窗口的一些状态、属性、view(增加、删除、更新)、窗口顺序、消息收集和处理等。通过Context.getSystemService(Context.WINDOW_SERVICE)的方式可以获得WindowManager的实例.悬浮在手机桌面,不受Activity界面的影响,说明该悬浮窗口是不隶属于Activity界面的,也就是说,它是隶属于启动它的应用程序所在进程。
首先得在应用程序的AndroidManifest.xml文件中添加权限
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
如果targetSdkVersion>=23,需要引导用户开启权限:
private static final int REQUEST_CODE = 1;private void requestAlertWindowPermission() { Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION); intent.setData(Uri.parse("package:" + getPackageName())); startActivityForResult(intent, REQUEST_CODE);}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE) { if (Settings.canDrawOverlays(this)) { Log.i(LOGTAG, "onActivityResult success"); } }}
2、android.R.id.content
Activity的setContentView(...)就是将其布局添加到id为content的Framelayout中。因此通过操作android.R.id.content,可以添加浮动页面到当前页面。主要代码如下:
public void showBannerAdView(Activity topActivity, AdLayoutParams params){ if(topActivity == null){ return; } removeFloatContainer(topActivity); if(params == null){ params = new AdLayoutParams(); } if(params.getHeight() <= 0){ params.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT); } if(params.getWidth() <= 0){ params.setWidth(ViewGroup.LayoutParams.MATCH_PARENT); } ViewGroup topActivityBox = topActivity.findViewById(android.R.id.content); BannerAdView bannerAdView = new BannerAdView(topActivity); bannerAdView.setId(R.id.float_banner_ad_view); FrameLayout.LayoutParams floatBoxParams = new FrameLayout.LayoutParams(params.getWidth(), params.getHeight()); floatBoxParams.gravity = params.getGravity(); topActivityBox.addView(bannerAdView, floatBoxParams); } private void removeFloatContainer(Activity activity) { if (activity != null) { View floatBox = activity.findViewById(R.id.float_banner_ad_view); removeFromParent(floatBox); } } private void removeFromParent(View view) { if (view != null) { ViewParent parent = view.getParent(); if (parent != null) { ((ViewGroup) parent).removeView(view); } } }
参考文档:
1、https://www.cnblogs.com/mythou/p/3244208.html
2、http://blog.csdn.net/vfush/article/details/51203092
3、http://blog.csdn.net/colinandroid/article/details/77748695
- 浮动窗口(Android)
- android 顶层浮动窗口
- Android浮动窗口实例
- android 360浮动窗口
- 浮动窗口(转)
- Android浮动窗口的实现
- android浮动小窗口设计
- android 视频浮动窗口化,
- Android之浮动小窗口
- 【Android】浮动窗口层级分析
- Android 实现顶层窗口、浮动窗口
- 开源项目之Android StandOut(浮动窗口)
- 开源项目之Android StandOut(浮动窗口)
- Android cpu 使用率控件(浮动窗口)附源码
- Android 浮动窗口进阶——画中画,浮动视频
- 窗口-》子窗口,子窗口-》浮动窗口(MFC)
- Android开发--桌面浮动歌词窗口
- 浮动窗口/浮动链接
- 新建一副图像
- C#学习笔记之——一些应用
- 如何计算一个字节中1的位数
- 线程同步3 ------ Linux进程间通信——使用信号量
- 使用自己安装的Maven插件
- 浮动窗口(Android)
- Linux中nmon的安装与使用
- spring data 复杂的查询,不用写sql
- 算法导论<1、课程简介与算法分析>
- 爬虫,可用于增加访问量和抓取网站全页内容
- unity平台预处理
- AI将改变工作方式,社会要学会适应!
- oracle--9.集合运算
- RabbitMQ入门-10-2(整合spring-发送同步消息注解实现)