Android 自定义PopupWindow指定位置或给定View坐标弹出

来源:互联网 发布:finereport 数据库 编辑:程序博客网 时间:2024/04/30 13:17

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;        }    }}

代码:https://github.com/jdsjlzx/PopupWindowHelper

0 1