化繁为简之SimplePopupWindow

    xiaoxiao2025-11-13  5

    最近项目里总是用到PopupWindow,功能不是很复杂但是写起来很繁琐、代码很乱,所以就自己封装了一个SimplePopupWindow,基于Builder模式。

    功能

    可点击空白地方或者返回键使PopupWindow消失可设置并调节半透明黑色背景,并且PopupWindow消失后背景色自动恢复不会被软键盘覆盖可设置是否同时弹出软键盘可设置进出动画

    一个简单带动画的PopupWindow弹出

    image

    只需四行代码加一个接口回调

    SimplePopupWindow.with(MainActivity.this) .setView(R.layout.popup_window_main) //设置你的视图资源文件 .setAnimationStyle(R.style.anim_simple_popup_window) //设置你的动画资源文件 .show(new SimplePopupWindow.Callback() { @Override public void getView(View view, PopupWindow popupWindow) { //view是你资源文件生成的视图 } });

    NOTE:后面放出动画的资源文件

    带半透明灰色背景

    image SimplePopupWindow.with(MainActivity.this) .setView(R.layout.popup_window_main) .setBackgroundAlpha(0.4f) //设置你的背景透明度 .show(new SimplePopupWindow.Callback() { @Override public void getView(View view, PopupWindow popupWindow) { } });

    API文档

    方法用途with(Activity activity)初始化show(Callback callback)弹出PopupWindowsetView(int ResId)设置视图的资源文件setLocation(int Lacation)设置弹出位置setBackgroundAlpha(float bgAlpha)设置黑色背景透明度setAnimationStyle(int animationStyle)设置动画的资源文件setAutoPopupInput(boolean isShowInput)设置是否自动弹出软键盘

    Note:

    不要在Activity的onCreate()方法中直接show(),因为此时Activity的视图开没有绘制完成。一定要在show()之前调用setView()。layout布局文件要设置固定高度或wrap_content

    SimplePopupWindow代码

    //直接新建SimplePopupWindow类拷贝过去 public class SimplePopupWindow { private Activity mActivity; private View mView; private boolean mIsShowInput; private int animationStyle; private int LOCATION = -1; public static SimplePopupWindow with(Activity activity) { return new SimplePopupWindow(activity); } public SimplePopupWindow(Activity activity) { mActivity = activity; animationStyle = -1; } //设置弹出位置,默认底部弹出 public void setLocation(int Lacation){ LOCATION = Lacation; } //视图资源,必须设置 public SimplePopupWindow setView(int ResId) { mView = LayoutInflater.from(mActivity).inflate(ResId, null); return this; } //弹出PopupWindow public void show(Callback callback) { if (mView == null){ Toast.makeText(mActivity,"请设置View", Toast.LENGTH_SHORT).show(); return; } PopupWindow window = new PopupWindow(mView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, true); if (animationStyle != -1) //如果设置了动画,则启用动画 window.setAnimationStyle(animationStyle); window.setBackgroundDrawable(new ColorDrawable()); window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); //不会被软键盘覆盖 window.setOnDismissListener(new PopupWindow.OnDismissListener() { //弹窗消失时恢复背景色 @Override public void onDismiss() { setBackgroundAlpha(1f); } }); callback.getView(mView,window); if (LOCATION != -1) window.showAtLocation(mActivity.getWindow().getDecorView().findViewById(android.R.id.content), LOCATION, 0, 0); else window.showAtLocation(mActivity.getWindow().getDecorView().findViewById(android.R.id.content), Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, 0); showInPut(); } //设置黑色半透明背景,建议设置0.4f,默认不设置 public SimplePopupWindow setBackgroundAlpha(float bgAlpha) { WindowManager.LayoutParams lp = mActivity.getWindow().getAttributes(); lp.alpha = bgAlpha; if (bgAlpha == 1) { mActivity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);//不移除该Flag的话,在有视频的页面上的视频会出现黑屏的bug } else { mActivity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);//此行代码主要是解决在华为手机上半透明效果无效的bug } mActivity.getWindow().setAttributes(lp); return this; } //设置是否自动弹出软键盘,默认为否 public SimplePopupWindow setAutoPopupInput(boolean isShowInput) { mIsShowInput = isShowInput; return this; } //设置进出动画 public SimplePopupWindow setAnimationStyle(int animationStyle){ this.animationStyle = animationStyle; return this; } //显示软键盘 private void showInPut(){ if (mIsShowInput){ new Handler().postDelayed(new Runnable() { @Override public void run() { InputMethodManager imm = (InputMethodManager)mActivity.getSystemService(Context.INPUT_METHOD_SERVICE); imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS); } }, 0); } } //接口回调 public interface Callback { void getView(View view, PopupWindow popupWindow); } }

    动画资源文件

    transition/out.xml (新建transition或anim目录)

    <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <translate android:duration="250" android:fromYDelta="0.0" android:toYDelta="100%" /> </set>

    transition/in.xml

    <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <translate android:duration="250" android:fromYDelta="100.0%" android:toYDelta="0.0" /> </set>

    values/styles.xml

    <style name="anim_simple_popup_window"> <item name="android:windowEnterAnimation">@transition/in</item> <item name="android:windowExitAnimation">@transition/out</item> </style>
    最新回复(0)