使用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的区别.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值