【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

原文地址:https://www.cnblogs.com/clnchanpin/p/7106317.html