转载请注明出处: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. BZOJ 4828 DP+BFS

    被一道简单BFS坑了这么长时间我也是hhh了 //By SiriusRen #include <bits/stdc++.h> using namespace std; ,,):d(D),x ...

  2. 胖ap和瘦ap的区别

    一,什么是AP,胖瘦AP如何区分?       先说说AP的概念.AP是Access Point的简称,即无线接入点,其作用是把局域网里通过双绞线传输的有线信号(即电信号)经过编译,转换成无线电信号传 ...

  3. 329 Longest Increasing Path in a Matrix 矩阵中的最长递增路径

    Given an integer matrix, find the length of the longest increasing path.From each cell, you can eith ...

  4. maven 纯注解一步一步搭建Spring Mvc项目(入门)

    初次接触spring MVC项目,通过一段时间的学习,本文介绍一种以纯注解的方法去配置spring MVC环境,让那些配置的.xml文件统统见鬼吧. 什么是Spring MVC Spring MVC属 ...

  5. Laravel5.1学习笔记12 系统架构4 服务容器

    Service Container 介绍 绑定的用法  绑定实例到接口 上下文绑定 标签 解析 容器事件 #介绍 The Laravel service container is a powerful ...

  6. [转][IPC通信]基于管道的popen和pclose函数

    标准I/O函数库提供了popen函数,它启动另外一个进程去执行一个shell命令行. 这里我们称调用popen的进程为父进程,由popen启动的进程称为子进程. popen函数还创建一个管道用于父子进 ...

  7. Ch03 React/JSX/Component 簡介

    Facebook 本身有提供 Test Utilities,但由于不够好用,所以目前主流开发社群比较倾向使用 Airbnb 团队开发的 enzyme,其可以与市面上常见的测试工具(Mocha.Karm ...

  8. C#——反射动态创建类的实例

    “反射”其实就是利用程序集的元数据信息. 反射可以有很多方法,编写程序时请先导入 System.Reflection 命名空间. 若要反射当前项目中的类(即当前项目已经引用它了),可以使用下面的写法. ...

  9. ajax不执行success的问题

    有时候经常会遇到ajax请求后台,然后后台返回数据后,不触发ajax的success函数的问题,归根到底,这与ajax的参数设置dataType和后台的返回值的类型有关,现总结如下: 一.后台返回值的 ...

  10. 不用float也可以让div横向显示

    display: inline-block; vertical-align: top; 就这两个属性,给div设置上,div就不会换行显示啦,而且还不影响横向的其他元素的显示.