zoukankan      html  css  js  c++  java
  • 【Anroid界面实现】WindowManager类使用具体解释——用户首次打开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设置非常多參数。以下我们看一下经常使用的设置

    // 设置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();
    	}
    
    }
    

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



        以下是代码实现

    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

  • 相关阅读:
    机器学习(01)——机器学习简介
    Harbor本地镜像库安装与使用
    大数据高可用集群环境安装与配置(10)——安装Kafka高可用集群
    大数据高可用集群环境安装与配置(09)——安装Spark高可用集群
    大数据高可用集群环境安装与配置(08)——安装Ganglia监控集群
    大数据高可用集群环境安装与配置(07)——安装HBase高可用集群
    大数据高可用集群环境安装与配置(06)——安装Hadoop高可用集群
    大数据高可用集群环境安装与配置(05)——安装zookeeper集群
    大数据高可用集群环境安装与配置(04)——安装JAVA运行环境
    大数据高可用集群环境安装与配置(03)——设置SSH免密登录
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/7106317.html
Copyright © 2011-2022 走看看