Android用户首次打开APP出现教学蒙层效果的实现

转载请注明出处: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设置很多参数,下面我们看一下常用的设置:

[java]  view plain copy
  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对象,使用很简单。除了这个方法,还有个windowManager.removeViewImmediate(),也可以将View移除,但是文档中说,这个方法并不是给一般程序调用的,因此需要小心使用,我们开发的都属于一般程序,建议不要使用这个方法。

   

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

    下面是我常用的一个工具类。

[java]  view plain copy
  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. }  

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

Android用户首次打开APP出现教学蒙层效果的实现_第1张图片


    下面是代码实现

[java]  view plain copy
  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

你可能感兴趣的:(Android开发)