使用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;
                //获取windowmanager
                final WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
                //调用addview方法就可以显示view
                wm.addView(tv,params);
                //设置键盘监听,否则是监听不到back键的
                tv.setOnKeyListener(new View.OnKeyListener() {
                    @Override
                    public 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() {
                    @Override
                    public void onClick(View v) {
                        wm.removeView(hook);
                    }
                });

其实普通窗口和系统窗口的区别就是一个是在当前activity显示的,一个是在系统中任何界面都一直显示的,创建他们的区别也主要是token的区别.

你可能感兴趣的:(anroid系统开发,android基础,界面)