Android 自定义PopupWindow指定位置或给定View坐标弹出
2016-07-26 11:12
537 查看
PopupWindowHelper是一个根据View的位置显示PopupWindow的一个工具类、弹出PopupWindow的位置会根据指定的View出现的位置而动态改变、本Demo是用Android Studio开发的、分为两个Module、但我个人更习惯合到一起、所以看个人需要了、代码很简单、就一个PopupWindowHelper工具类、然后直接可以在Activity上面使用了、效果如下:
PopupWindowHelper代码
调用:
代码:https://github.com/jdsjlzx/PopupWindowHelper
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
相关文章推荐
- 笔记---Android 中各个Layout属性的含义
- android字符串国际化
- Android 上重启应
- Android Fragment使用详解及生命周期
- android studio 快捷键
- Android屏幕适配终结者
- 退出Activity的方法
- 老罗的Android之旅
- Android AlarmReceive的启动和关闭
- android studio 提高编译的速度,安装apk过慢问题解决
- 为何 Android 开发者在逐渐用 FlatBuffers 替代 JSON
- 开发日记——手机安全卫士 Day07 2016-7-26 电话短信拦截功能
- NoSuchMethodError: android.content.res.Resources.getDrawable
- Android 画波纹进度条
- Android蓝牙通信编程
- Android Material Design系列之主题样式介绍说明等
- 各LaunchMode的使用场景
- Android开发创建文件夹失败解决方案
- android studio no usages found in project
- 【Egret】Native版本 视频播放器(android)