自定义PopupWindowHelper根据指定位置或给定View坐标弹出
程序员文章站
2022-03-01 12:36:49
...
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); } }
Activity调用代码
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; } } }
源代码下载链接: http://dwtedx.com/download.html?bdkey=s/1dEkBQIP 密码: 6awx