转载请注明出处: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设置非常多參数。以下我们看一下经常使用的设置

// 设置LayoutParams參数
LayoutParams params = new WindowManager.LayoutParams();
//设置显示的类型。TYPE_PHONE指的是来电话的时候会被覆盖,其它时候会在最前端。显示位置在stateBar以下,其它很多其它的值请查阅文档
params.type = WindowManager.LayoutParams.TYPE_PHONE;
//设置显示格式
params.format = PixelFormat.RGBA_8888;
//设置对齐方式
params.gravity = Gravity.LEFT | Gravity.TOP;
//设置宽高
params.width = ScreenUtils.getScreenWidth(this);
params.height = ScreenUtils.getScreenHeight(this);
//设置显示的位置
params.x;
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的一个对象。然后我们就能够获取到当前屏幕的一些參数。比方说宽高。

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

package com.qust.teachmask;

import android.content.Context;
import android.view.WindowManager; /**
* 屏幕帮助类
*
* @author zhaokaiqiang
*
*/
public class ScreenUtils { /**
* 获取屏幕宽度
*
* @return
*/
@SuppressWarnings("deprecation")
public static int getScreenWidth(Context context) {
return ((WindowManager) context
.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay()
.getWidth();
} /**
* 获取屏幕宽度
*
* @return
*/
@SuppressWarnings("deprecation")
public static int getScreenHeight(Context context) {
return ((WindowManager) context
.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay()
.getHeight();
} }

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

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

以下是代码实现

package com.qust.teachmask;

import android.app.Activity;
import android.graphics.PixelFormat;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType; public class MainActivity extends Activity { private ImageView img; private WindowManager windowManager; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); windowManager = getWindowManager(); // 动态初始化图层
img = new ImageView(this);
img.setLayoutParams(new LayoutParams(
android.view.ViewGroup.LayoutParams.MATCH_PARENT,
android.view.ViewGroup.LayoutParams.MATCH_PARENT));
img.setScaleType(ScaleType.FIT_XY);
img.setImageResource(R.drawable.guide); // 设置LayoutParams參数
LayoutParams params = new WindowManager.LayoutParams();
// 设置显示的类型,TYPE_PHONE指的是来电话的时候会被覆盖,其它时候会在最前端,显示位置在stateBar以下,其它很多其它的值请查阅文档
params.type = WindowManager.LayoutParams.TYPE_PHONE;
// 设置显示格式
params.format = PixelFormat.RGBA_8888;
// 设置对齐方式
params.gravity = Gravity.LEFT | Gravity.TOP;
// 设置宽高
params.width = ScreenUtils.getScreenWidth(this);
params.height = ScreenUtils.getScreenHeight(this); // 加入到当前的窗体上
windowManager.addView(img, params); // 点击图层之后。将图层移除
img.setOnClickListener(new OnClickListener() { @Override
public void onClick(View arg0) {
windowManager.removeView(img);
}
}); }
}

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. scrapy 框架持久化存储

    1.基于终端的持久化存储 保证爬虫文件的parse方法中有可迭代类型对象(通常为列表或字典)的返回,该返回值可以通过终端指令的形式写入指定格式的文件中进行持久化操作. # 执行输出指定格式进行存储:将 ...

  2. 316 Remove Duplicate Letters 去除重复字母

    给定一个仅包含小写字母的字符串,去除重复的字母使得所有字母出现且仅出现一次.你必须保证返回结果是所有可能结果中的以字典排序的最短结果.例如:给定 "bcabc"返回 "a ...

  3. python gdal 修改shp文件的属性值

    driver = ogr.GetDriverByName('ESRI Shapefile')datasource = driver.Open(shpFileName, 1)layer = dataso ...

  4. brew update失败提示:/System/Library/Frameworks/Ruby.framework/的解决方法

    本文由@ray 出品,转载请注明出处.  文章链接:http://www.cnblogs.com/wolfray/p/8040701.html 想用brew安装wget,但是提示失败,然后想先 bre ...

  5. Angular——tab切换案例

    基本介绍 angular框架下的tab切换,相比较于之前的纯js写的代码,有一个很大的特点就是以数据为驱动,基本上不用搜索dom元素就可以实现效果 基本使用 (1)导航部分使用的是的状态使用的是ng- ...

  6. html5——web存储

    基本概念 1.传统方式我们以document.cookie来进行存储的,但是由于其存储大小只有4k左右,并且解析也相当的复杂,给开发带来诸多不便 2.h5存储设置.读取方便,而且容量较大,sessio ...

  7. html5——3D案例(立方体)

    立方体:父盒子规定了3d呈现属性,立方体做旋转运动 移动顺序:1.每个盒子都先移动100px,然后再做相应的旋转  2.只有这样立方体的几何中心点与父盒子的几何中心点是一样的 <!DOCTYPE ...

  8. servlet-响应的定时刷新

    package servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.ser ...

  9. Python语言之函数

    1.函数的定义与调用 def function(x): print("function(%s)"%x) function("hello") #call the ...

  10. GNSS数据下载网站

    Bernese 数据表文件下载 rinex文件下载 ftp://nfs.kasi.re.kr DCB.ION文件ftp://ftp.unibe.ch/AIUB/CODE/ 下载5.0更新文件 ftp: ...