Window表示一个窗体的概念。
所有的界面中的View其实都是依附在Window上。 我们可以通过WindowManager来对Window上的View进行管理。常见的方法有:
windowManager.addView(View,WindowManager.LayoutParam); windowManager.removeView(); windowManager.getDefaultDisplay();我们采用addView 来添加一个悬浮的按钮。 首先,先获取WindowManager实例。
WindowManager windowManager = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE);然后在定义我们的按钮以及布局属性。
Button mFloatingButton = new Button(this); mFloatingButton.setText("button");这里属性就不详细写了。
WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams( WindowManager.LayoutParams.WRAP_CONTENT,WindowManager.LayoutParams.WRAP_CONTENT,0,0, PixelFormat.TRANSPARENT); layoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT; layoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED; layoutParams.gravity = Gravity.LEFT | Gravity.TOP; layoutParams.x = 100; layoutParams.y = 300;最后通过addView方法将按钮添加到window上:
windowManager.addView(mFloatingButton,layoutParams);这里我们的功能略显得简单了,但是使用WindowManager来实现悬浮窗确是非常普遍的被使用。如我们平时见到的如下的界面:
上面使用了WindowManager添加了一个全屏的ImageView,并未ImageView添加了图片资源,实现了上述效果。
当然我们也还可以使用removeView来进行悬浮View的移除。 比如说我们自己的例子,便是在上面添加的悬浮按钮的点击事件中移除它。
mFloatingButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { windowManager.removeView(mFloatingButton); } });点击之后移除成功。使用WIndowManager实现简单的悬浮窗就是这么简单!
注意:在添加View时,对布局参数的type属性一定要设置为:
layoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;并在AndroidManifest.xml中声明相关权限。 不然会报错哟:
Process: com.example.zoutao.test, PID: 19346 java.lang.RuntimeException: Unable to start activity ComponentInfo {com.example.zoutao.test/com.example.zoutao.test.MainActivity}: android.view.WindowManager$InvalidDisplayException: Unable to add window android.view.ViewRootImpl$W@38cabbd1 -- the specified window type is not valid