1. 程式人生 > >Android 自定義PopupWindow指定位置或給定View座標彈出

Android 自定義PopupWindow指定位置或給定View座標彈出

PopupWindowHelper是一個根據View的位置顯示PopupWindow的一個工具類、彈出PopupWindow的位置會根據指定的View出現的位置而動態改變、本Demo是用Android Studio開發的、分為兩個Module、但我個人更習慣合到一起、所以看個人需要了、程式碼很簡單、就一個PopupWindowHelper工具類、然後直接可以在Activity上面使用了、效果如下:

這裡寫圖片描述

PopupWindowHelper程式碼

public class PopupWindowHelper {

    private View popupView;
    private
PopupWindow mPopupWindow; private static final int TYPE_WRAP_CONTENT = 0, TYPE_MATCH_PARENT = 1; public PopupWindowHelper(View view) { popupView = view; } public void showAsDropDown(View anchor) { mPopupWindow.showAsDropDown(anchor); } public void showAsDropDown
(View anchor, int xoff, int yoff) { initPopupWindow(TYPE_WRAP_CONTENT); mPopupWindow.showAsDropDown(anchor, xoff, yoff); } public void showAtLocation(View parent, int gravity, int x, int y) { initPopupWindow(TYPE_WRAP_CONTENT); mPopupWindow.showAtLocation(parent, gravity, x, y); } public
void dismiss() { if (mPopupWindow.isShowing()){ mPopupWindow.dismiss(); } } public void showAsPopUp(View anchor) { showAsPopUp(anchor, 0, 0); } public void showAsPopUp(View anchor, int xoff, int yoff) { initPopupWindow(TYPE_WRAP_CONTENT); mPopupWindow.setAnimationStyle(R.style.AnimationUpPopup); popupView.measure(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); int height = popupView.getMeasuredHeight(); int[] location = new int[2]; anchor.getLocationInWindow(location); mPopupWindow.showAtLocation(anchor, Gravity.LEFT | Gravity.TOP, location[0] xoff, location[1] - height yoff); } public void showFromBottom(View anchor) { initPopupWindow(TYPE_MATCH_PARENT); mPopupWindow.setAnimationStyle(R.style.AnimationFromButtom); mPopupWindow.showAtLocation(anchor, Gravity.LEFT | Gravity.BOTTOM, 0, 0); } public void showFromTop(View anchor) { initPopupWindow(TYPE_MATCH_PARENT); mPopupWindow.setAnimationStyle(R.style.AnimationFromTop); mPopupWindow.showAtLocation(anchor, Gravity.LEFT | Gravity.TOP, 0, getStatusBarHeight()); } /** * touch outside dismiss the popupwindow, default is ture * @param isCancelable */ public void setCancelable(boolean isCancelable) { if (isCancelable) { mPopupWindow.setOutsideTouchable(true); mPopupWindow.setFocusable(true); }else { mPopupWindow.setOutsideTouchable(false); mPopupWindow.setFocusable(false); } } public void initPopupWindow(int type) { if (type == TYPE_WRAP_CONTENT) { mPopupWindow = new PopupWindow(popupView, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); }else if (type == TYPE_MATCH_PARENT) { mPopupWindow = new PopupWindow(popupView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); } mPopupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); setCancelable(true); } private int getStatusBarHeight() { return Math.round(25 * Resources.getSystem().getDisplayMetrics().density); } }

呼叫:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private PopupWindowHelper popupWindowHelper;
    private View popView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findViewById(R.id.button).setOnClickListener(this);
        popView = LayoutInflater.from(this).inflate(R.layout.popupview, null);
        popupWindowHelper = new PopupWindowHelper(popView);
        popView.findViewById(R.id.button3).setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.button:
                popupWindowHelper.showAsPopUp(v);
                break;
            default:
                break;
        }
    }
}