PopubWindow

一、简介:

PopubWindow,悬浮窗,支持滑动的悬浮窗(也可称为弹窗),与Dialog不同的是AlteDialog不支持移动,而PopubWindow则可以,两者相比有以下优缺点:

(1)PopubWindow支持滑动,内容可以是任意自定义的View,比较灵活随意,弹框位置比较随意,而AlteDialog相对位置比较固定,显示的内容比较单一。
(2)PopubWindow是阻塞线程的,而AlteDialog是非阻塞线程的,这意味着一旦使用了PopubWindow,除非调用他的dissmiss方法退出,否则主线程的其他操作无法被响应。

二、使用

(1)获取View:
view = LayoutInflater.from(theApp).inflate(R.layout.eraser_size,null);
(2)初始化Window:
window = new PopupWindow(view,width ,heght, true)

true表示获取焦点

(3)显示:
window.showAtLocation(parenView, Gravity.LEFT | Gravity.TOP,px,py);

showAtLocation表示显示在距离parentView在x轴上px距离,y轴上py距离的地方,Gravity形式为gravity的地方(此处为 Gravity.LEFT | Gravity.TOP)

三、实现移动:

例子:

view.setOnTouchListener(new View.OnTouchListener() {
          
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                switch (motionEvent.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        orgX = (int) motionEvent.getX();
                        orgY = (int) motionEvent.getY();
                        break;
                    case MotionEvent.ACTION_MOVE:
                        offsetX = (int) motionEvent.getRawX() - orgX;
                        offsetY = (int) motionEvent.getRawY() - orgY;
                   
                        window.update(offsetX, offsetY, width==0?ViewGroup.LayoutParams.WRAP_CONTENT:width,
                                height==0?ViewGroup.LayoutParams.WRAP_CONTENT:height, true);
                        break;
                    case MotionEvent.ACTION_UP:
                        break;
                }
                return true;
            }
        });

关键代码:

  window.update(newX, newY, width,height, true);

设置为true,在需要时,即使指定的位置已经与LayoutParams对应,也要重新定位窗口。newX和newY为新的起点坐标。

你可能感兴趣的:(PopubWindow)