本文主要是介绍使用Windowmanager给界面添加窗口,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
添加普通窗口
btn.setOnClickListener(new View.OnClickListener() {//创建要显示的View
final TextView tv = new TextView(BezierViewActivity.this);tv.setBackgroundColor(Color.WHITE);tv.setText("子窗口");//同一个acitiviy下的token都是相同的,所以这里直接用v的就可以IBinder token = v.getWindowToken();WindowManager.LayoutParams params = new WindowManager.LayoutParams();//指定窗口类型params.type = WindowManager.LayoutParams.TYPE_APPLICATION_PANEL;params.token = token;//获取windowmanagerfinal WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);//调用addview方法就可以显示viewwm.addView(tv,params);//设置键盘监听,否则是监听不到back键的tv.setOnKeyListener(new View.OnKeyListener() {@Overridepublic boolean onKey(View v, int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYCODE_BACK) {wm.removeView(tv);}return false;}});}
添加系统窗口
系统窗口比较特殊需要权限,因为系统窗口是可以在系统任何界面显示的
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"></uses-permission>
final Button hook = new Button(getApplicationContext());hook.setText("hello window");WindowManager.LayoutParams params = new WindowManager.LayoutParams(150,100,WindowManager.LayoutParams.TYPE_PRIORITY_PHONE,WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|WindowManager.LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING,PixelFormat.RGBX_8888);params.gravity = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM;params.setTitle("title");//这里为什么要new 一个新binder呢,是因为如果用父窗口的token,那么当父窗口隐藏了//它的子窗口也会隐藏,而在wms内部会判断如果一个token没有父窗口,才会把该窗口的层值调到屏幕最上方,让他显示出来params.token = new Binder();final WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);wm.addView(hook,params);hook.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {wm.removeView(hook);}});
其实普通窗口和系统窗口的区别就是一个是在当前activity显示的,一个是在系统中任何界面都一直显示的,创建他们的区别也主要是token的区别.
这篇关于使用Windowmanager给界面添加窗口的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!