PopupWindow 使用介绍
一、popupWindow使用时候需要注意的方法
public void setFocusable(boolean focusable) ;
public void setOutsideTouchable(boolean touchable);
1、setFocusable(true)的时候,会获取屏幕焦点,这时候点击外部弹框会消失,会拦截事件,即触控事件不会传入popupWindow外的控件。
2、setOutsideTouchable(touchable) 只有在setFocusable(false)的时候生效。表示外部是否可以被点击,即事件是否可以传入popupWindow下面的控件。
-
setOutsideTouchable(false)点击的事件会传入popupWindow外的控件,popupWindow不消失。
-
setOutsideTouchable(true) 点击的事件会传入popupWindow外的控件,popupWindow消失
Notice:需要手动设置popupWindow.setWidth(value); popupWindow.setHeight(value);宽高,否则可能popupWindow不显示。
3、setTouchListener,设置监听事件,即可拦截事件是否下发。
private void setTouchListener( PopupWindow popupWindow){
popupWindow.setTouchInterceptor(new View.OnTouchListener(){
@Override
public boolean onTouch(View v, MotionEvent event) {
Log.e("lammy", "envent .........." + event.getRawX());
Log.e("lammy", "envent .........." + event.getRawY());
return false;
}
});
}
通过log发现,event.getRawX、event.getRawY()获得的是以屏幕左上角为坐标原点的坐标。这里可以根据获得点击坐标,和其他控件在屏幕中位置,来写比较复杂的逻辑。
二、显示
-
showAtLocation
public void showAtLocation(View parent, int gravity, int x, int y) ;
-
parent:一般传入开启显示的view
-
gravity: Gravity.LEFT|Gravity.TOP等一个或者多个,window里内容的对齐方式
-
x: x坐标
-
y:y坐标从状态栏下开始
2、showAsDropDown
public void showAsDropDown(View anchor, int xoff, int yoff);
public void showAsDropDown(View anchor);
public void showAsDropDown(View anchor, int xoff, int yoff, int gravity) ;
-
anchor 一般是在哪个控件下显示
-
xoff 相对于anchor
-
yoff 相对于anchor
-
gravity 存放控件对其方式
Notice:无论哪种显示方式,如果设置偏移量,屏幕显示不全, 都会更改位置,让其显示完整。
示例:
private void initPopWindow(View view){
PopupWindow popupWindow = new PopupWindow(this);
popupWindow.setFocusable(false);
popupWindow.setOutsideTouchable(true);
popupWindow.setWidth(500);
popupWindow.setHeight(200);
TextView textView = new TextView(this);
textView.setTextColor(0xff000000);
textView.setBackgroundColor(0xff00ff00);
textView.setText("lammy test pop Window");
popupWindow.setContentView(textView);
setTouchListener(popupWindow);
popupWindow.showAsDropDown(view, 30,0 );
}