記錄學習之用
View view = mInflater.inflate(R.layout.layout_popupwindow, null); PopUpwindowLayout popUpwindowLayout = (PopUpwindowLayout) view.findViewById(R.id.llayout_popupwindow); popUpwindowLayout.initViews(mContext, titles, false); final PopupWindow popupWindow = new PopupWindow(view, LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); //測量view 注意這里,如果沒有測量 ,下面的popupHeight高度為-2 ,因為LinearLayout.LayoutParams.WRAP_CONTENT這句自適應造成的 view.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED); int popupWidth = view.getMeasuredWidth(); // 獲取測量后的寬度 int popupHeight = view.getMeasuredHeight(); //獲取測量后的高度 int[] location = new int[2]; // 允許點擊外部消失 popupWindow.setBackgroundDrawable(new BitmapDrawable());//注意這里如果不設置,下面的setOutsideTouchable(true);允許點擊外部消失會失效 popupWindow.setOutsideTouchable(true); //設置外部點擊關閉ppw窗口 popupWindow.setFocusable(true); // 獲得位置 這里的v是目標控件,就是你要放在這個v的上面還是下面 v.getLocationOnScreen(location); popupWindow.setAnimationStyle(R.style.mypopwindow_anim_style); //設置動畫
//這里就可自定義在上方和下方了 ,這種方式是為了確定在某個位置,某個控件的左邊,右邊,上邊,下邊都可以 popupWindow.showAtLocation(v, Gravity.NO_GRAVITY, (location[0] + v.getWidth() / 2) - popupWidth / 2, location[1] - popupHeight);
//因為ppw提供了在某個控件下方的方法,所以有些時候需要直接定位在下方時並不用上面的這個方法
ppwfilter.showAsDropDown(v); // 以觸發彈出窗的view為基准,出現在view的正下方,彈出的pop_view左上角正對view的左下角 偏移量默認為0,0
ppwfilter.showAsDropDown(v, xoff, yoff); // 有參數的話,就是一view的左下角進行偏移,xoff正的向左,負的向右. yoff沒測,也應該是正的向下,負的向上
ppwfilter.showAsDropDown(parent, xoff, yoff, gravity) //parent:傳你當前Layout的id; gravity:Gravity.BOTTOM(以屏幕左下角為參照)... 偏移量會以它為基准點 當x y為0,0是出現在底部居中
注意:在安卓7.0上請看下面要注意的地方
/**
* 在android7.0上,如果不主動約束PopuWindow的大小,比如,設置布局大小為 MATCH_PARENT,那么PopuWindow會變得盡可能大,以至於 view下方無空間完全顯示PopuWindow,而且view又無法向上滾動,此時PopuWindow會主動上移位置,直到可以顯示完全。
* 解決辦法:主動約束PopuWindow的內容大小,重寫showAsDropDown方法:
* @param anchor
*/
@Override
public void showAsDropDown(View anchor) {
if(Build.VERSION.SDK_INT >= 24){
Rect visibleFrame = new Rect();
anchor.getGlobalVisibleRect(visibleFrame);
int height = anchor.getResources().getDisplayMetrics().heightPixels - visibleFrame.bottom;
setHeight(height);
}
super.showAsDropDown(anchor);
}