自定义通过PopupWindow实现通用菜单

会经常用户到菜单选项提供给用户选择,例如选择图片,图库和相机选择等一系列场景吧,根据为了以后更加方便使用通过自定义封装了一个菜单,主要是通过一个列表展示,将菜单项列表传入设置参数就可以显示,使用方便简单只需要几行代码就可以,可以显示在底部,居中和某个控件的下方。先看效果图吧


居中显示
底部显示
置于控件下方

看过效果图接下来看一下用法

List<MenuModel> menus =new ArrayList<>();

PopMenu popMenu=new PopMenu.MenuBuilder(activity,menus, new BaseQuickAdapter.OnItemClickListener() {

@Override

    public void onItemClick(BaseQuickAdapter adapter, View view, int position) {

})//必须设置 当前activity,menus 菜单项,菜单点击事件

.focusable(true)//是否获取焦点

.outsideTouchable(true)//点击外部是否小时

.showIco(false)//是否显示菜单图标

.setElevation(true)//背景是否置灰

.hasDiver(false)//是否显示分割线

.setItemBackground(R.drawable.pop_menu_item_selector)//菜单子项背景

.show(rightImg,0,60);//置于控件下方

只需要设置需要的属性就可以显示并使用了,另外show()默认居中显示 showBottom()在底部显示

用法是不是很简单呢,接下来就要看源码了

package shens.library.base.view.menu;

import android.app.Activity;

import android.graphics.drawable.BitmapDrawable;

import android.support.v7.widget.LinearLayoutManager;

import android.support.v7.widget.RecyclerView;

import android.view.Gravity;

import android.view.LayoutInflater;

import android.view.View;

import android.view.WindowManager;

import android.widget.PopupWindow;

import java.util.List;

import shens.library.base.R;

import shens.library.base.adapter.recyle.BaseQuickAdapter;

import shens.library.base.utils.ScreenUtils;

/**

* 弹出菜单

* Created by shenshilei on 2018/1/4.

* email ssl_java@163.com

* site http://www.houziyou.com

*/

public class PopMenu {

private ActivitymContext;//上下文

    private ViewmPopWindowView;

    private RecyclerViewmenuListView;

    private PopupWindowpopupWindow;

    private PopupWindow.OnDismissListenerdimisListener;

    private BaseQuickAdapter.OnItemClickListeneronItemClickListener;

    private MenuListAdaptermenuListAdapter;

    private ListmenuModels;

    private boolean isShowIco =false;

    private int mWidth;

    private boolean isSetElevation=true;//背景是否阴影

    public PopMenu(Activity mContext, List menus){

this.mContext = mContext;

        popupWindow =new PopupWindow(mContext);

        this.menuModels = menus;

        initView();

    }

private void initView() {

mWidth= ScreenUtils.getScreemWidth(mContext)/2;

        mPopWindowView = LayoutInflater.from(mContext).inflate(R.layout.pop_menu_view,null);

        menuListView = (RecyclerView)mPopWindowView.findViewById(R.id.pop_menu_listview);

        menuListView.setLayoutManager(new LinearLayoutManager(mContext));

        menuListAdapter=new MenuListAdapter(isShowIco,LinearLayoutManager.VERTICAL ,R.layout.pop_menu_item,menuModels);

        menuListAdapter.setOnItemClickListener(onItemClickListener);

        popupWindow.setBackgroundDrawable(new BitmapDrawable());

        popupWindow.setFocusable(true);

        popupWindow.setOutsideTouchable(true);

        popupWindow.setWidth(mWidth);

        popupWindow.setContentView(mPopWindowView);

        popupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {

@Override

            public void onDismiss() {

setViewNoElevation();

                if(dimisListener!=null){

dimisListener.onDismiss();

                }

}

});

    }

public void setOnItemClickListener(BaseQuickAdapter.OnItemClickListener onItemClickListener){

this.onItemClickListener = onItemClickListener;

        menuListAdapter.setOnItemClickListener(this.onItemClickListener);

    }

public void setWidth(int width){

this.mWidth = width;

    }

public void setHasDiver(boolean isHasDivier){

menuListAdapter.setIsDiver(isHasDivier);

    }

public void setMenuItemBackground(int resid){

menuListAdapter.setItemBackground(resid);

    }

public void showCenter(){

setViewElevation();

        menuListView.setAdapter(menuListAdapter);

        popupWindow.setAnimationStyle(R.style.popupwindow_alph);

        popupWindow.showAtLocation(mContext.getWindow().getDecorView(), Gravity.CENTER,0,0);

    }

public void show(){

showCenter();

    }

public void showBottom(){

setViewElevation();

        menuListView.setAdapter(menuListAdapter);

        popupWindow.setAnimationStyle(R.style.popupwindow_botoom);

        popupWindow.showAtLocation(mContext.getWindow().getDecorView(), Gravity.BOTTOM,0,0);

    }

public void setIsshowIco(boolean isshowIco){

this.isShowIco=isshowIco;

    }

public void setElevation(boolean isSetElevation){

this.isSetElevation=isSetElevation;

    }

private void setFocusable(boolean focusable){

popupWindow.setFocusable(focusable);

    }

private void setOutSideable(boolean outSideable){

popupWindow.setOutsideTouchable(outSideable);

    }

private void setViewElevation(){

//产生背景变暗效果

        if(isSetElevation){

WindowManager.LayoutParams lp =mContext.getWindow().getAttributes();

            lp.alpha =0.6f;

            mContext.getWindow().setAttributes(lp);

        }

}

private void setViewNoElevation(){

if(isSetElevation){

WindowManager.LayoutParams lp =mContext.getWindow().getAttributes();

            lp.alpha =1.0f;

            mContext.getWindow().setAttributes(lp);

        }

}

public void show(View view){

setViewElevation();

        menuListView.setAdapter(menuListAdapter);

        popupWindow.showAsDropDown(view);

    }

public void show(View view,int x,int y){

setViewElevation();

        menuListView.setAdapter(menuListAdapter);

        popupWindow.showAsDropDown(view,x,y);

    }

public void dismis(){

if(popupWindow!=null)

popupWindow.dismiss();

    }

public MenuListAdaptergetAdapter(){

return menuListAdapter;

    }

public void setOndismisListener(PopupWindow.OnDismissListener dimisListener){

this.dimisListener =dimisListener;

    }

public static class MenuBuilder{

private Activityactivity;

        Listmenus;

        private PopupWindow.OnDismissListenerdimisListener;

        private BaseQuickAdapter.OnItemClickListeneronItemClickListener;

        private boolean isShowIco =false;//是否显示图标

        private boolean isHasDiver=false;//是否显示分割线

        private int itemBackResId;

        private int mWidth;

        private boolean isSetElevation=true;

        private boolean isFocused =true;

        private boolean isOutSideTouchable =true;

        public MenuBuilder(Activity activity,List menus,BaseQuickAdapter.OnItemClickListener onItemClickListener){

this.activity =activity;

            this.menus = menus;

            this.onItemClickListener = onItemClickListener;

            mWidth= ScreenUtils.getScreemWidth(activity)/2;//默认宽度为屏幕的一半

            itemBackResId=R.drawable.pop_menu_item_selector;

        }

public MenuBuilderdimisListener(PopupWindow.OnDismissListener dimisListener){

this.dimisListener = dimisListener;

return this;

        }

public MenuBuildersetItemBackground(int resid){

this.itemBackResId = resid;

return this;

        }

public MenuBuildershowIco(boolean isShowIco){

this.isShowIco = isShowIco;

return this;

        }

public MenuBuilderhasDiver(boolean isHasDiver){

this.isHasDiver = isHasDiver;

return this;

        }

public MenuBuilderfocusable(boolean isFocused){

this.isFocused = isFocused;

return this;

        }

public MenuBuilderoutsideTouchable(boolean isOutSideTouchable){

this.isOutSideTouchable = isOutSideTouchable;

return this;

        }

public MenuBuildersetElevation(boolean isSetElevation){

this.isSetElevation = isSetElevation;

return this;

        }

public MenuBuilderwidth(int mWidth){

this.mWidth = mWidth;

return this;

        }

public PopMenucreate(){

PopMenu popMenu =new PopMenu(activity,menus);

            popMenu.setWidth(mWidth);

            popMenu.setHasDiver(true);

            popMenu.setIsshowIco(isShowIco);

            popMenu.setElevation(isSetElevation);

            popMenu.setFocusable(isFocused);

            popMenu.setHasDiver(isHasDiver);

            popMenu.setOutSideable(isOutSideTouchable);

            popMenu.setMenuItemBackground(itemBackResId);

            popMenu.setOndismisListener(dimisListener);

            popMenu.setOnItemClickListener(onItemClickListener);

            return popMenu;

        }

public PopMenushow(){

PopMenu popMenu = create();

            popMenu.show();

            return  popMenu;

        }

public PopMenushowBottom(){

PopMenu popMenu = create();

            popMenu.showBottom();

            return  popMenu;

        }

public PopMenushow(View view,int x,int y){

PopMenu popMenu = create();

            popMenu.show(view,x,y);

            return  popMenu;

        }

}

}

以上就是菜单的核心代码了,需要详细或者是有疑问可以评论留言沟通

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,511评论 1 330
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,495评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,595评论 0 225
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,558评论 0 190
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,715评论 3 270
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,672评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,112评论 2 291
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,837评论 0 181
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,417评论 0 228
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,928评论 2 232
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,316评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,773评论 2 234
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,253评论 3 220
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,827评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,440评论 0 180
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,523评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,583评论 2 249

推荐阅读更多精彩内容