Android底部弹出的popupWindow
16lz
2021-01-23
public class PopupFromBottom extends PopupWindow { /** * 显示模式. */ private int showModel; /** * 先出现 蒙板 列表后弹出. */ public static final int PART = 1; /** * 列表 和 蒙板 从底部弹出. */ public static final int SIMULTANEOUSLY = 2; private final RecyclerView recyclerView; private Activity activity; public PopupFromBottom(Activity activity, List<String> list, OnItemClickListener onItemClickListener) { this(activity, list, 0, onItemClickListener); } public PopupFromBottom(Activity activity, List<String> list, int showModel, OnItemClickListener onItemClickListener) { super(activity); this.activity = activity; this.showModel = showModel; View view = View.inflate(activity, R.layout.popu_list_layout, null); TextView tvCancel = (TextView) view.findViewById(R.id.tv_cancel_popup); tvCancel.setOnClickListener((v) -> dismiss()); // 销毁popupWindow recyclerView = (RecyclerView) view.findViewById(R.id.recycler_popup); setRecyclerView(list, onItemClickListener); this.setBackgroundDrawable(new ColorDrawable(Color.parseColor("#66000000"))); // 设置背景为半透明 setOutsideTouchable(true); // 设置外部点击消失 setContentView(view); //设置填充视图 switch (showModel) { case PART: setHeight(LinearLayoutCompat.LayoutParams.WRAP_CONTENT); // 设置高度 break; case SIMULTANEOUSLY: setHeight(LinearLayoutCompat.LayoutParams.MATCH_PARENT); // 设置高度 break; default: setHeight(LinearLayoutCompat.LayoutParams.WRAP_CONTENT); // 设置高度 break; } setWidth(LinearLayoutCompat.LayoutParams.MATCH_PARENT); // 设置宽度 setFocusable(true); // 设置获取焦点 setAnimationStyle(R.style.dialog_bottom_default); // 设置进入动画 } /** * 设置 recyclerView. */ private void setRecyclerView(List list, OnItemClickListener onItemClickListener) { recyclerView.setLayoutManager(new LinearLayoutManager(activity)); recyclerView.setAdapter(new BaseQuickAdapter<String, BaseViewHolder>(R.layout.item_popup, list) { @Override protected void convert(BaseViewHolder helper, String item) { helper.setText(R.id.tv_item_popup, item); } }); recyclerView.addOnItemTouchListener(onItemClickListener); } /** * 显示 popupWindow. */ public void show() { switch (showModel) { case PART: setBackgroundAlpha(0.7f); //设置屏幕透明度 this.setOnDismissListener(() -> setBackgroundAlpha(1.0f)); break; case SIMULTANEOUSLY: break; default: setBackgroundAlpha(0.5f);//设置屏幕透明度 this.setOnDismissListener(() -> setBackgroundAlpha(1.0f)); break; } this.showAtLocation(activity.getWindow().getDecorView(), Gravity.BOTTOM, 0, 0); } /** * 设置添加屏幕的背景透明度 * * @param bgAlpha 屏幕透明度0.0-1.0 1表示完全不透明 */ private void setBackgroundAlpha(float bgAlpha) { WindowManager.LayoutParams lp = activity.getWindow().getAttributes(); lp.alpha = bgAlpha; activity.getWindow().setAttributes(lp); }}
View 的 布局:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#19000000" android:gravity="bottom" android:orientation="vertical"> <android.support.v7.widget.RecyclerView android:id="@+id/recycler_popup" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/BLACK"> </android.support.v7.widget.RecyclerView> <TextView android:id="@+id/tv_cancel_popup" android:layout_width="match_parent" android:layout_height="45dp" android:background="@color/BLACK" android:drawableTop="@mipmap/popup_div_cancel" android:gravity="center" android:text="@string/cancel" android:textColor="@color/text_color_bind_selector" android:textSize="18sp" /></LinearLayout>
style :
<style name="dialog_bottom_default" parent="Animation.AppCompat.Dialog"> <item name="android:windowEnterAnimation">@anim/dialog_bottom_enter</item> <item name="android:windowExitAnimation">@anim/dialog_bottom_exit</item> </style>
item 布局:
<?xml version="1.0" encoding="utf-8"?><TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/tv_item_popup" android:layout_width="match_parent" android:layout_height="45dp" android:drawableTop="@mipmap/popup_div_recycler" android:gravity="center" android:text="删除" android:textColor="@drawable/selector_text_color" android:textSize="16sp"></TextView>
其中使用了 第三方库BaseRecyclerViewAdapterHelper来填充 recyclerView
关于BaseRecyclerViewAdapterHelper 的使用 参考:https://github.com/CymChad/BaseRecyclerViewAdapterHelper
更多相关文章
- android多屏幕适配相关知识和官方翻译文档
- Android 四种获取屏幕宽度的方法总结
- 关于Android屏幕密度与分辨率
- Android 根据屏幕大小设置字体
- android获取屏幕长宽,status bar高度,设置全屏显示
- Android 获得屏幕宽高的三种方式
- Android实现屏幕截图并保存截图到指定文件
- 【Android Training - 02】适配不同的屏幕[Lesson 1 - 支持不同