自定義通過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閱讀 228,936評論 6 535
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,744評論 3 421
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,879評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,181評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,935評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,325評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,384評論 3 443
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,534評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,084評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,892評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,067評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,623評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,322評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,735評論 0 27
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,990評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,800評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,084評論 2 375

推薦閱讀更多精彩內容