一、简介:
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为新的起点坐标。