转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992

在上一篇的文章中,我们介绍了怎样实现桌面悬浮窗体,在这个效果的实现过程中。最重要的一个类就是WindowManager。今天这篇文章,将对WindowManager的使用进行介绍。而且实现一个使用WindowManager来实现用户打开APP,显示首次使用教学蒙板的效果。

WindowManager类实现了ViewManager接口,ViewManager接口同意我们在Activity上加入或者是移除view,因此WindowManager也同意我们在Activity上进行View的加入和移除操作。

我们能够通过以下的方法获取一个WindowManager对象

Context.getSystemService(Context.WINDOW_SERVICE)

在Activity之中,我们能够直接通过getWindowManager()获取到一个WindowManager对象。

每个WindowManager实例都被绑定到一个独有的Display对象上面。假设我们想获取不同Display的WindowManager对象,我们能够通过createDisplayContext(Display)获取到这个Display的Context对象。然后使用上面的方法。也能够获取到一个WindowManager对象。

我们在使用WindowManager类的时候,通常使用以下的几个方法:

windowManager.addView(View,WindowManager.LayoutParam);

windowManager.removeView();

windowManager.getDefaultDisplay();

windowManager.addView()方法用来向当前的窗体上加入View对象。须要接受两个參数,View是要加入到窗体的View对象,而WindowManager.LayoutParam则是加入的窗体的參数,在上一篇加入悬浮窗的操作的时候,须要对LayoutParam设置非常多參数。以下我们看一下经常使用的设置

  1. // 设置LayoutParams參数
  2. LayoutParams params = new WindowManager.LayoutParams();
  3. //设置显示的类型。TYPE_PHONE指的是来电话的时候会被覆盖,其它时候会在最前端。显示位置在stateBar以下,其它很多其它的值请查阅文档
  4. params.type = WindowManager.LayoutParams.TYPE_PHONE;
  5. //设置显示格式
  6. params.format = PixelFormat.RGBA_8888;
  7. //设置对齐方式
  8. params.gravity = Gravity.LEFT | Gravity.TOP;
  9. //设置宽高
  10. params.width = ScreenUtils.getScreenWidth(this);
  11. params.height = ScreenUtils.getScreenHeight(this);
  12. //设置显示的位置
  13. params.x;
  14. params.y;

设置好LayoutParam之后,我们就能够通过windowManager.addView(View,WindowManager.LayoutParam)将View加入到窗体之上,只是,我们须要申明权限

<uses-permissionandroid:name="android.permission.SYSTEM_ALERT_WINDOW"/>

加入完毕之后,我们就能够在窗体上看到我们加入的View对象了。假设我们想将加入的View移除,我们仅仅须要调用windowManager.removeView()就可以,參数就是我们前面使用的View对象。使用非常easy。除了这种方法。还有个windowManager.removeViewImmediate(),也能够将View移除,可是文档中说,这种方法并非给一般程序调用的,因此须要小心使用,我们开发的都属于一般程序,建议不要使用这种方法。

除了这两个方法之外,我们最经常使用的另外一个方法就是windowManager.getDefaultDisplay(),通过这种方法,我们能够获取到当前界面的Display的一个对象。然后我们就能够获取到当前屏幕的一些參数。比方说宽高。

以下是我经常使用的一个工具类。

  1. package com.qust.teachmask;
  2.  
  3. import android.content.Context;
  4. import android.view.WindowManager;
  5.  
  6. /**
  7. * 屏幕帮助类
  8. *
  9. * @author zhaokaiqiang
  10. *
  11. */
  12. public class ScreenUtils {
  13.  
  14. /**
  15. * 获取屏幕宽度
  16. *
  17. * @return
  18. */
  19. @SuppressWarnings("deprecation")
  20. public static int getScreenWidth(Context context) {
  21. return ((WindowManager) context
  22. .getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay()
  23. .getWidth();
  24. }
  25.  
  26. /**
  27. * 获取屏幕宽度
  28. *
  29. * @return
  30. */
  31. @SuppressWarnings("deprecation")
  32. public static int getScreenHeight(Context context) {
  33. return ((WindowManager) context
  34. .getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay()
  35. .getHeight();
  36. }
  37.  
  38. }

知道上面这些之后,我们就能够实现教学模板效果了。首先看效果图。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhb2thaXFpYW5nMTk5Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" width="540" height="960" alt="">

以下是代码实现

  1. package com.qust.teachmask;
  2.  
  3. import android.app.Activity;
  4. import android.graphics.PixelFormat;
  5. import android.os.Bundle;
  6. import android.view.Gravity;
  7. import android.view.View;
  8. import android.view.View.OnClickListener;
  9. import android.view.WindowManager;
  10. import android.view.WindowManager.LayoutParams;
  11. import android.widget.ImageView;
  12. import android.widget.ImageView.ScaleType;
  13.  
  14. public class MainActivity extends Activity {
  15.  
  16. private ImageView img;
  17.  
  18. private WindowManager windowManager;
  19.  
  20. @Override
  21. protected void onCreate(Bundle savedInstanceState) {
  22. super.onCreate(savedInstanceState);
  23. setContentView(R.layout.activity_main);
  24.  
  25. windowManager = getWindowManager();
  26.  
  27. // 动态初始化图层
  28. img = new ImageView(this);
  29. img.setLayoutParams(new LayoutParams(
  30. android.view.ViewGroup.LayoutParams.MATCH_PARENT,
  31. android.view.ViewGroup.LayoutParams.MATCH_PARENT));
  32. img.setScaleType(ScaleType.FIT_XY);
  33. img.setImageResource(R.drawable.guide);
  34.  
  35. // 设置LayoutParams參数
  36. LayoutParams params = new WindowManager.LayoutParams();
  37. // 设置显示的类型,TYPE_PHONE指的是来电话的时候会被覆盖,其它时候会在最前端,显示位置在stateBar以下,其它很多其它的值请查阅文档
  38. params.type = WindowManager.LayoutParams.TYPE_PHONE;
  39. // 设置显示格式
  40. params.format = PixelFormat.RGBA_8888;
  41. // 设置对齐方式
  42. params.gravity = Gravity.LEFT | Gravity.TOP;
  43. // 设置宽高
  44. params.width = ScreenUtils.getScreenWidth(this);
  45. params.height = ScreenUtils.getScreenHeight(this);
  46.  
  47. // 加入到当前的窗体上
  48. windowManager.addView(img, params);
  49.  
  50. // 点击图层之后。将图层移除
  51. img.setOnClickListener(new OnClickListener() {
  52.  
  53. @Override
  54. public void onClick(View arg0) {
  55. windowManager.removeView(img);
  56. }
  57. });
  58.  
  59. }
  60. }

github项目地址:https://github.com/ZhaoKaiQiang/TeachMask

【Anroid界面实现】WindowManager类使用具体解释——用户首次打开APP的使用教学蒙板效果实现的更多相关文章

  1. iOS用户是否打开APP通知开关跳转到系统的设置界面

    1.检测用户是否打开推送通知  /** 系统通知是否打开 @return 是否打开 */ //检测通知是否打开iOS8以后有所变化 所以需要适配iOS7 + (BOOL)openThePushNoti ...

  2. [转]java的(PO,VO,TO,BO,DAO,POJO)类名包名解释

    java的(PO,VO,TO,BO,DAO,POJO)类名包名解释 2015-04-28 20:11 by Loull, 18 阅读, 0 评论, 收藏, 编辑 VO:值对象.视图对象 PO:持久对象 ...

  3. Android界面相关的类

    Android界面相关的类 Window Activity的显示界面对象,并作为顶层View被加入到WindowManager中.Window提供了标准的UI显示策略:界面背景.标题区域.默认的事件处 ...

  4. 基于SqlSugar的开发框架循序渐进介绍(6)-- 在基类接口中注入用户身份信息接口

    在基于SqlSugar的开发框架中,我们设计了一些系统服务层的基类,在基类中会有很多涉及到相关的数据处理操作的,如果需要跟踪具体是那个用户进行操作的,那么就需要获得当前用户的身份信息,包括在Web A ...

  5. 手机浏览网页或打开App时莫名弹出支付宝领红包界面的原因及应对措施

    自从支付宝推出扫码领红包活动后,这种模式独特的赏金机制,短时间内吸引了大量的关注,但是随之也产生了很多的问题,比由于如在赏金的驱动下,微信群里铺天盖地的红包口令,朋友圈里各式各样的领红包二维码图片, ...

  6. iOS10 打开APP设置界面和WIFI界面

    在iOS10以上,权限这块有了一些变化 首先在info的URL Types 添加  prefs 1.打开APP设置界面 //打开设置 let url:NSURL = NSURL(string: UIA ...

  7. 在学习c++过程中,总结类的三个用户以及使用权限,感觉非常实用

    首先我们需要知道类的三个用户分别是:类的实现者,类的普通用户和类的继承者(派生类),接下来分别讲解这几种用户的区别. 1 .类的实现者:顾明思议,就是类的设计者,拥有最大的权限,可以访问类中任何权限的 ...

  8. 【Python-Django定义用户模型类】Python-Django定义用户模型类详解!!!

    定义用户模型类 1. Django默认用户认证系统 Django自带用户认证系统 它处理用户账号.组.权限以及基于cookie的用户会话. Django认证系统位置 django.contrib.au ...

  9. PyQt(Python+Qt)入门:Designer组件属性编辑界面中QWidget类相关属性详解

    本文适用人员:本文比较长,适合不理解Qt Designer部件属性的人员阅读或资料查找. 声明: 1.如果有人认为本文是简单的复制粘贴+翻译而成,敬请读本文最后的后记: 2.本文为老猿Python学习 ...

随机推荐

  1. 发布 Windows 服务

    1. 如何新建 Windows 服务 打开VS,“新建项目”-->“windows 桌面”-->“windows 服务”: http://www.cnblogs.com/sorex/arc ...

  2. Web页面使用VLC播放插件

    一.原生态Demo下载 选择原因:我们为什么选择VLC播放插件?原因是它支持IE8浏览器播放视频,如果高版本的浏览器大可不必选择该插件,很多html5插件既好用又简单,但是有些交管或政府 部门还是限制 ...

  3. Spring boot中的定时任务(计划任务)

    从Spring3.1开始,计划任务在Spring中实现变得异常的简单.首先通过配置类注解@EnableScheduling来开启对计划任务的支持,然后再要执行的计划任务的方法上注释@Scheduled ...

  4. spring-framework-4.1.x源码阅读环境搭建(导入Eclipse)

    注意:搭建spring-framework-4.1.x源码 eclipse工作空间需要安装jdk8. spring-framework-4.1.x项目采用目前主流的项目管理工具gradle进行构建,至 ...

  5. android计算屏幕dp

    首先我们来了解一些基本元素: px:像素,屏幕上的点. dpi:一英寸长的直线上的像素点的数量,即像素密度.标准值是160dp. /*** 正是因为dpi值其代表的特性,所以android项目的资源文 ...

  6. jQuery——this

    js注册事件this代表的dom对象 jQuery注册事件this代表的也是dom对象,所以需要$(this)转成jQuery对象

  7. java设计模式03装饰者者模式

    动态地给一个对象添加一些额外的职责.就增加功能来说, Decorator模式相比生成子类更为灵活.该模式以对客 户端透明的方式扩展对象的功能. (1)在不影响其他对象的情况下,以动态.透明的方式给单个 ...

  8. 011--c数组--排序--组成最大数

    数组--排序--组成最大数   组成最大数   任意输入一个自然数,输出该自然数的各位数字组成的最大数.例如,输入 1593 ,则输出为 9531 . 输入: 自然数 n 输出: 各位数字组成的最大数 ...

  9. 在iOS项目中嵌入RN代码

    1:在项目跟目录下创建一个ReactComponent文件夹.目录结构如下: 2: 在ReactComponent文件夹下新建一个 package.json 文件 { "name" ...

  10. SqlServer IsNull 与 NullIf

    ISNULL(check_expression, replacement_value) check_expression 与 replacement_value 数据类型必须一致,如果 check_e ...