自定义Popwindow

示例:
在这里插入图片描述
方法调用:

   private void showPopWindow() {
        List<XinPopWindow.MenuItem> menuItems = new ArrayList<>();
        menuItems.add(new XinPopWindow.MenuItem("拍摄", 1));
        menuItems.add(new XinPopWindow.MenuItem("拍照", 2));
        final XinPopWindow mPopUpload = new XinPopWindow(this);
        mPopUpload.setData(menuItems);
        mPopUpload.showAtLocation(findViewById(R.id.root), Gravity.BOTTOM, 0, 0);
        mPopUpload.setOnItemClickListener(new XinPopWindow.OnItemClickListener() {
            @Override
            public void onItemClick( View view, int position,  int type) {
                mPopUpload.dismiss();
                switch (type) {
                    case 1:
                        Toast.makeText(MainActivity.this, "拍摄", Toast.LENGTH_LONG).show();
                        break;
                    case 2:
                        Toast.makeText(MainActivity.this, "拍照", Toast.LENGTH_LONG).show();
                        break;
                }
            }
        });
    }

源码:

package com.net.popwindow;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v4.content.ContextCompat;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.PopupWindow;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

public class XinPopWindow extends PopupWindow {
    private static OnItemClickListener mOnItemClickListener;
    private Activity mContext;
    private Window mWindow;
    private RecyclerView mItems;
    private static MenuAdapter menuAdapter;

    XinPopWindow(Activity context) {
        mContext = context;
        mWindow = mContext.getWindow();
        restoreBackgroundAlpha();
        LayoutInflater inflater =
                (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        @SuppressLint("InflateParams") View mMenuView = inflater.inflate(R.layout.common_popwindow, null, false);
        View btnCancel = mMenuView.findViewById(R.id.btn_cancel);
        btnCancel.setOnClickListener(
                new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        dismiss();
                    }
                });
        mItems = mMenuView.findViewById(R.id.itemList);
        mItems.setLayoutManager(new LinearLayoutManager(mContext));
        menuAdapter = new MenuAdapter();
        mItems.setAdapter(menuAdapter);

        mMenuView.setOnTouchListener(
                new View.OnTouchListener() {
                    @SuppressLint("ClickableViewAccessibility")
                    @Override
                    public boolean onTouch(View v, MotionEvent event) {
                        if (event.getAction() == MotionEvent.ACTION_UP || event.getY() < mItems.getTop())
                            XinPopWindow.this.dismiss();
                        return true;
                    }
                });
        setOutsideTouchable(true);
        this.setFocusable(true);
        this.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
        this.setWidth(WindowManager.LayoutParams.MATCH_PARENT);
        this.setHeight(WindowManager.LayoutParams.MATCH_PARENT);
        this.setContentView(mMenuView);
        setBackgroundDrawable(
                ContextCompat.getDrawable(mContext.getApplication(), android.R.color.transparent));
        this.setAnimationStyle(R.style.common_PopupAnimation);

        setOnDismissListener(
                new OnDismissListener() {
                    @Override
                    public void onDismiss() {
                        restoreBackgroundAlpha();
                    }
                });
    }

    private void backgroundAlpha(float bgAlpha) {
        if (mWindow == null) {
            mWindow = mContext.getWindow();
        }
        if (mWindow == null) return;
        WindowManager.LayoutParams lp = mWindow.getAttributes();
        mWindow.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
        lp.alpha = bgAlpha; // 0.0-1.0
        mWindow.setAttributes(lp);
    }

    private void restoreBackgroundAlpha() {
        if (mWindow == null) {
            mWindow = mContext.getWindow();
        }
        if (mWindow == null) return;
        mWindow.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
        WindowManager.LayoutParams lp = mWindow.getAttributes();
        lp.alpha = 1;
        mWindow.setAttributes(lp);
    }

    @Override
    public void showAtLocation(View parent, int gravity, int x, int y) {
        super.showAtLocation(parent, gravity, x, y);
        backgroundAlpha(0.6f);
    }

    void setData(List<MenuItem> menuItems) {
        menuAdapter.setMenuItems(menuItems);
    }

    void setOnItemClickListener(final OnItemClickListener listener) {

        mOnItemClickListener = listener;
    }

    / 事件监听

    public interface OnItemClickListener {
        void onItemClick(View view, int position, int type);
    }


    public static class MenuAdapter extends RecyclerView.Adapter<MenuAdapter.RVViewHolder> {

        List<MenuItem> menuItems;

        MenuAdapter() {
            menuItems = new ArrayList<>();
        }

        @NonNull
        @Override
        public RVViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
            @SuppressLint("InflateParams") View view = LayoutInflater.from(viewGroup.getContext())
                    .inflate(R.layout.common_item_popup_bottom, viewGroup, false);
            return new RVViewHolder(view);
        }

        @Override
        public void onBindViewHolder(@NonNull RVViewHolder holder, int position) {
            final int pos = position;
            holder.btn.setText(menuItems.get(position).name);
            if (position == 0) {
                holder.btn.setBackgroundResource(R.drawable.common_btn_pop_choose_pic_up);
            } else {
                holder.btn.setBackgroundResource(R.drawable.common_btn_pop_choose_pic_mid);
            }
            if (position == menuItems.size() - 1) {
                holder.line.setVisibility(View.GONE);
            } else {
                holder.line.setVisibility(View.VISIBLE);
            }
            holder.btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if (mOnItemClickListener != null)
                        mOnItemClickListener.onItemClick(
                                view, pos, menuItems.get(pos).type);
                }
            });
        }

        @Override
        public int getItemCount() {
            return menuItems.size();
        }

        private static class RVViewHolder extends RecyclerView.ViewHolder {
            TextView btn;
            View line;

            RVViewHolder(@NonNull View itemView) {
                super(itemView);
                btn = itemView.findViewById(R.id.btn_);
                line = itemView.findViewById(R.id.line_);
            }
        }


        void setMenuItems(List<MenuItem> menuItems) {
            this.menuItems = menuItems;
            notifyDataSetChanged();
        }
    }

    public static class MenuItem {
        String name;
        int type;

        MenuItem(String name, int type) {
            this.name = name;
            this.type = type;
        }

        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (!(o instanceof MenuItem)) return false;
            MenuItem menuItem = (MenuItem) o;

            return type == menuItem.type
                    && (name != null ? name.equals(menuItem.name) : menuItem.name == null);
        }

        @Override
        public int hashCode() {
            int result = name != null ? name.hashCode() : 0;
            result = 31 * result + type;
            return result;
        }
    }
}

Demo地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值