【Anroid界面实现】WindowManager类使用详解——用户首次打开APP的使用教学蒙板效果实现
来源:互联网 发布:java中级软件工程师 编辑:程序博客网 时间:2024/04/30 19:03
转载请注明出处: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对象,使用很简单。除了这个方法,还有个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();
- }
- }
知道上面这些之后,我们就可以实现教学模板效果了,首先看效果图。
下面是代码实现
- 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的使用教学蒙板效果实现
- 【Anroid界面实现】WindowManager类使用详解——用户首次打开APP的使用教学蒙板效果实现
- 【Android】WindowManager类使用详解——用户首次打开APP的使用教学蒙板效果实现
- WindowManager类使用详解——用户首次打开APP的使用教学蒙板效果实现
- WindowManager类使用详解——用户首次打开APP的使用教学蒙板效果实现
- Android用户首次打开APP的使用教学蒙板效果实现
- Android用户首次打开APP出现教学蒙层效果的实现
- 【常用工具类】WindowManager 类使用详解—蒙板效果实现
- 在Unity中实现首次打开APP进行教学的功能
- android 用 SharedPreferences实现app首次使用显示引导界面,之后使用将不再出现
- APP首次打开的欢迎界面
- 在app第一次打开时使用anroid-flip来制作过渡界面
- 如何实现App程序安装首次打开的导引图
- WindowManager和WindowManager.LayoutParams的使用以及实现悬浮窗口
- [Android 界面] WindowManager的使用
- [Android 界面] WindowManager的使用
- 安卓-使用WindowManager实现类似Toast效果
- Android APP首次安装 教学引导效果
- VxWorks移植到AT91RM9200的BSP定制过程
- hadoop基础知识<转>
- CreateThread 使用不当引起内在泄露? CreateThread 和 _beginthreadex 区别。
- ios UIWebView singleTap 单击事件的坑
- Oracle如何实现创建数据库、备份数据库及数据导出导入的一条龙操作
- 【Anroid界面实现】WindowManager类使用详解——用户首次打开APP的使用教学蒙板效果实现
- Mac下MySQL卸载方法(完整版)
- 【struts2】jsp如何获取struts2 action中返回的对象的值
- The network bridge on device VMnet0 is not running
- 字符串输入函数的若干不同
- ios8 跳转settings
- Silverlight 5 Beta新特性[6]低延迟对WAV格式声音效果支持
- new和delete的指针类型必须一致,否则会造成未定义行为
- 有些事你不做,你想要的生活就永远得不到