`
wangleyiang
  • 浏览: 220579 次
社区版块
存档分类
最新评论

Android 显示View在顶级窗口

阅读更多

    通过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,并添加到你的目标窗口!:)

 

分享到:
评论

相关推荐

    android获取根View的方法

    Activity的DecorView是所有窗口内容的顶级容器,它可以包含根View。我们可以通过如下方式获取: ```java View decorView = getWindow().getDecorView(); ViewGroup rootView = (ViewGroup) decorView.findViewById...

    android利用windowmanager的伸缩式窗口

    在Android开发中,WindowManager是一个非常重要的服务,它允许开发者将视图添加到系统的顶级窗口层次结构中,实现各种自定义的界面效果。本篇主要探讨如何利用WindowManager的`addView()`方法来创建一个可伸缩的弹出...

    Android 核心分析(13) -----Android GWES之Android窗口管理.doc

    Window在Android中代表顶级窗口,而DecorView作为Window的顶级视图,是Activity的主要视图组件,它会自动附加到Activity的主窗口上。当Activity创建其主窗口并将其添加到WindowManager时,它会通过一个WindowManager...

    android遮挡系统拨号界面 类似360来电显示的那个绿色 页面

    在Android系统中,"遮挡系统拨号界面"通常指的是创建一个悬浮窗口或者顶级窗口(Top Window),使其能够在用户进行拨号操作时显示在系统拨号界面之上,类似360来电显示那样显示一些自定义信息,比如联系人头像、姓名...

    13问13答全面学习Android View绘制

    对于顶级View(如DecorView),它的measureSpec在`ViewRootImpl`中确定,基于屏幕的大小和窗口尺寸要求。 4. **父View在measure过程中的作用**:在measure过程中,父View(通常是ViewGroup)扮演关键角色。它会调用...

    android实现桌面移动悬浮窗口

    现在很多应用都有这样的功能,...比如创建系统顶级窗口,实现悬浮窗口效果!然后通过覆写悬浮View中onTouchEvent方法来改变windowMananager.LayoutParams中x和y的值来实现自由移动悬浮窗口。 二、示例代码 先看看悬浮Vi

    安卓Android源码——窗口抖动(源码).zip

    在安卓(Android)系统中,窗口抖动是一个关键的用户界面交互机制,它涉及到视图动画、触摸事件处理以及UI刷新等多个方面的知识。窗口抖动通常是指用户在屏幕上滑动或者点击时,视图元素跟随用户的操作而产生的平滑...

    ScreenShotSample_android截屏_DEMO_android截屏demo_

    首先,获取顶级窗口(如`WindowManager`的默认`DecorView`),然后调用`draw()`方法将内容绘制到`Canvas`,再将`Canvas`关联的`Bitmap`作为截图保存。 ```java View decorView = activity.getWindow().getDecorView...

    Android 视频悬浮窗

    服务启动后,我们可以通过`LayoutParams`设置悬浮窗的位置和大小,并将其添加到顶级窗口: ```java WindowManager.LayoutParams params = new WindowManager.LayoutParams( WindowManager.LayoutParams.WRAP_...

    Android应用源码之应用悬浮图标显示.zip

    `WindowManager`允许开发者将View添加到系统的顶级窗口上,使其能够在所有应用之上显示。 3. **LayoutParams**: `LayoutParams`是定义视图在窗口中布局的重要参数。对于悬浮图标,通常使用`WindowManager....

    Android图形处理.ppt

    DecorView是窗口的顶级View,整个ViewTree的根节点,它与Activity的主窗口相连。ViewRoot是一个Handler,作为View与WindowManager通信的中介。动画的绘制过程涉及递归地绘制整个窗口,包括绘制背景、可能的层保存、...

    Android代码实现截屏

    在Android中,我们可以利用`View`类提供的`draw()`方法将Activity的视图内容绘制到一个`Bitmap`对象上,从而实现截图。以下是一个简单的步骤概述: 1. **获取root view**: 首先,我们需要获取当前Activity的顶级...

    Android事件分发机制

    ViewRootImpl是Android视图系统的入口,它负责将事件传递给DecorView,这是每个Activity的顶级View。DecorView进一步将事件分发给Activity设置的ContentView。在这个过程中,事件的分发遵循“自顶向下”的原则,即从...

    免root实现截屏Android例子源码

    - `WindowManager`:提供对窗口管理的操作,可以获取到顶级窗口的信息。 - `ViewRootImpl`:窗口的根视图实现,可以获取到其Surface对象。 - `SurfaceControl`:用于控制Surface的类,其中的`snapshot()`方法用于...

    总结Android GWES基本原理.docx

    DecorView作为顶级窗口,是每个Activity的根视图,它会被添加到WindowManager中,与WindowState对象对应,用于管理窗口状态。 3. **消息系统**:Android使用Looper、MessageQueue和Handler构建了一个消息循环。...

    Android之Input子系统事件分发流程 - CSDN博客1

    在步骤3,`mWindowSession.addToDisplay()` 被调用,这个方法会将新视图添加到显示列表,并且将之前创建的InputChannel与服务端建立连接。`mWindowSession` 是一个IWindowSession接口的实现,它是由`...

    android Tabhost使用Demo

    TabHost是一个容器,它可以在一个窗口内展示多个Tab标签,并且每个标签可以链接到不同的布局或Activity。TabHost通常与TabWidget(显示Tab标签的组件)和FrameLayout(用来加载各个Tab的内容)一起使用。 2. **...

    Android截屏Demo

    在Demo中,你需要获取顶级的`WindowManager`服务,然后遍历所有的`View`,调用`draw()`方法将屏幕内容绘制到一个`Bitmap`对象上。这通常通过以下步骤完成: - 获取`WindowManager`服务:`WindowManager ...

    android popupwindow的使用

    PopupWindow的显示依赖于WindowManager服务,它是Android系统的顶级窗口管理器,负责管理所有应用的窗口。在创建PopupWindow时,实际上会通过WindowManager添加一个Window。虽然PopupWindow提供了简便的接口,但它...

    Android代码-tabhost--UI源码.zip

    在Android的早期版本中,TabHost是非常流行的一种导航方式,但现在已被FragmentTabHost和BottomNavigationView等现代组件所替代。然而,了解TabHost仍然是学习Android历史和进阶开发的重要一环。 首先,TabHost包含...

Global site tag (gtag.js) - Google Analytics