通过WindowManager可以添加View到Window,但是根据获得方式不同,View被添加到的目标窗口也不一样。
// 获得Application的窗口
WindowManager windowManager = (WindowManager) getApplicationContext().getSystemService(WINDOW_SERVICE);
// 获得Activity的窗口
WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
具体效果通过调整代码看到,如果使用第一种方法,退出应用后,被添加的View还存在;如果使用第二种方法,退出应用后,被添加的View消失,而且会报错。
下面以添加一个ImageView到窗口为例,简要说明添加的方式:
// 创建LayoutParams
WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();
// 设置窗口的类型
layoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT
| WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY;
// 设置行为选项
layoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
// 设置透明度
layoutParams.alpha = 80;
DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
// 设置位置
layoutParams.x = (int) (Math.random() * displayMetrics.widthPixels);
layoutParams.y = (int) (Math.random() * displayMetrics.heightPixels);
// 设置宽高
layoutParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
layoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
// 创建需要添加的View
ImageView imageView = new ImageView(this);
imageView.setBackgroundResource(R.drawable.anhuioss);
// 添加到View到窗口
WindowManager windowManager = (WindowManager) getApplicationContext().getSystemService(WINDOW_SERVICE);
windowManager.addView(imageView, layoutParams);
为了控制已经添加的View,可以通过下面的方法删除已经添加的View:
windowManager.removeView(imageView);
做这个操作还需要一个权限:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
关于这个权限的作用,可以参考谷歌开发者网站!:)
上面的ImageView仅仅是一个示例,开发者可以创建自己的View,并添加到你的目标窗口!:)
分享到:
相关推荐
Activity的DecorView是所有窗口内容的顶级容器,它可以包含根View。我们可以通过如下方式获取: ```java View decorView = getWindow().getDecorView(); ViewGroup rootView = (ViewGroup) decorView.findViewById...
在Android开发中,WindowManager是一个非常重要的服务,它允许开发者将视图添加到系统的顶级窗口层次结构中,实现各种自定义的界面效果。本篇主要探讨如何利用WindowManager的`addView()`方法来创建一个可伸缩的弹出...
Window在Android中代表顶级窗口,而DecorView作为Window的顶级视图,是Activity的主要视图组件,它会自动附加到Activity的主窗口上。当Activity创建其主窗口并将其添加到WindowManager时,它会通过一个WindowManager...
在Android系统中,"遮挡系统拨号界面"通常指的是创建一个悬浮窗口或者顶级窗口(Top Window),使其能够在用户进行拨号操作时显示在系统拨号界面之上,类似360来电显示那样显示一些自定义信息,比如联系人头像、姓名...
对于顶级View(如DecorView),它的measureSpec在`ViewRootImpl`中确定,基于屏幕的大小和窗口尺寸要求。 4. **父View在measure过程中的作用**:在measure过程中,父View(通常是ViewGroup)扮演关键角色。它会调用...
现在很多应用都有这样的功能,...比如创建系统顶级窗口,实现悬浮窗口效果!然后通过覆写悬浮View中onTouchEvent方法来改变windowMananager.LayoutParams中x和y的值来实现自由移动悬浮窗口。 二、示例代码 先看看悬浮Vi
在安卓(Android)系统中,窗口抖动是一个关键的用户界面交互机制,它涉及到视图动画、触摸事件处理以及UI刷新等多个方面的知识。窗口抖动通常是指用户在屏幕上滑动或者点击时,视图元素跟随用户的操作而产生的平滑...
首先,获取顶级窗口(如`WindowManager`的默认`DecorView`),然后调用`draw()`方法将内容绘制到`Canvas`,再将`Canvas`关联的`Bitmap`作为截图保存。 ```java View decorView = activity.getWindow().getDecorView...
服务启动后,我们可以通过`LayoutParams`设置悬浮窗的位置和大小,并将其添加到顶级窗口: ```java WindowManager.LayoutParams params = new WindowManager.LayoutParams( WindowManager.LayoutParams.WRAP_...
`WindowManager`允许开发者将View添加到系统的顶级窗口上,使其能够在所有应用之上显示。 3. **LayoutParams**: `LayoutParams`是定义视图在窗口中布局的重要参数。对于悬浮图标,通常使用`WindowManager....
DecorView是窗口的顶级View,整个ViewTree的根节点,它与Activity的主窗口相连。ViewRoot是一个Handler,作为View与WindowManager通信的中介。动画的绘制过程涉及递归地绘制整个窗口,包括绘制背景、可能的层保存、...
在Android中,我们可以利用`View`类提供的`draw()`方法将Activity的视图内容绘制到一个`Bitmap`对象上,从而实现截图。以下是一个简单的步骤概述: 1. **获取root view**: 首先,我们需要获取当前Activity的顶级...
ViewRootImpl是Android视图系统的入口,它负责将事件传递给DecorView,这是每个Activity的顶级View。DecorView进一步将事件分发给Activity设置的ContentView。在这个过程中,事件的分发遵循“自顶向下”的原则,即从...
- `WindowManager`:提供对窗口管理的操作,可以获取到顶级窗口的信息。 - `ViewRootImpl`:窗口的根视图实现,可以获取到其Surface对象。 - `SurfaceControl`:用于控制Surface的类,其中的`snapshot()`方法用于...
DecorView作为顶级窗口,是每个Activity的根视图,它会被添加到WindowManager中,与WindowState对象对应,用于管理窗口状态。 3. **消息系统**:Android使用Looper、MessageQueue和Handler构建了一个消息循环。...
在步骤3,`mWindowSession.addToDisplay()` 被调用,这个方法会将新视图添加到显示列表,并且将之前创建的InputChannel与服务端建立连接。`mWindowSession` 是一个IWindowSession接口的实现,它是由`...
TabHost是一个容器,它可以在一个窗口内展示多个Tab标签,并且每个标签可以链接到不同的布局或Activity。TabHost通常与TabWidget(显示Tab标签的组件)和FrameLayout(用来加载各个Tab的内容)一起使用。 2. **...
在Demo中,你需要获取顶级的`WindowManager`服务,然后遍历所有的`View`,调用`draw()`方法将屏幕内容绘制到一个`Bitmap`对象上。这通常通过以下步骤完成: - 获取`WindowManager`服务:`WindowManager ...
PopupWindow的显示依赖于WindowManager服务,它是Android系统的顶级窗口管理器,负责管理所有应用的窗口。在创建PopupWindow时,实际上会通过WindowManager添加一个Window。虽然PopupWindow提供了简便的接口,但它...
在Android的早期版本中,TabHost是非常流行的一种导航方式,但现在已被FragmentTabHost和BottomNavigationView等现代组件所替代。然而,了解TabHost仍然是学习Android历史和进阶开发的重要一环。 首先,TabHost包含...