1.Android的窗口结构
Android中所有的视图都是通过Window来呈现的,它们的视图实际上都是附加在Window上的
2.window的层级
Window 是分层的,每个 Window 都有对应的 z-ordered,层级大的会覆盖在层级小的 Window 上面(因此层级越大的离用户越近).在三种 Window 中,应用 Window 层级范围是 1~99,子 Window 层级范围是 1000~1999,系统 Window 层级范围是 2000~2999,我们可以用一个表格来直观的表示:
Window | 层级 |
---|---|
应用 Window | 1~99 |
子 Window | 1000~1999 |
系统 Window | 2000~2999 |
3.申请权限
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
4.判断悬浮窗权限的方法
android.provider.Settings.canDrawOverlays(Context)
5.使用windowmanager添加视图
public class MainActivity extends Activity {
Button button;
Context context;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = findViewById(R.id.bt);
context = getApplicationContext();
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
View view = LayoutInflater.from(context).inflate(R.layout.test, null); //加载View视图,这个就是我们要显示的内容
WindowManager windowManager = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE); //获取WindowManager
WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();
//设置LayoutParams的属性
layoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; //该Type描述的是形成的窗口的层级关系,视图显示的window
layoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | //该flags描述的是窗口的模式,是否可以触摸,可以聚焦等
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
layoutParams.gravity = Gravity.CENTER; //设置窗口的位置
layoutParams.format = PixelFormat.TRANSLUCENT; //不设置这个弹出框的透明遮罩显示为黑色
layoutParams.width = WindowManager.LayoutParams.MATCH_PARENT; //窗口的宽
layoutParams.height = WindowManager.LayoutParams.MATCH_PARENT; //窗口的高
windowManager.addView(view, layoutParams); //显示窗口
}
});
}
}