Android 實現(xiàn)微信長按菜單 -FloatMenu
在日常開發(fā)中,長按某個view出現(xiàn)個菜單是很常見的需求,Google 也給我們提供了一些組件來實現(xiàn),比如PopupMenu。但是在實際使用中還是發(fā)現(xiàn)他無法滿足我們的所有需求。
比如:產(chǎn)品要求長按菜單出現(xiàn)在手指按下的位置,額 這就頭疼了,PopupMenu只能展示在view的底部或者頭部。還有個問題如果你的view過長超過一屏,那么 PopupMenu 就無法顯示在屏幕里了。
所以沒辦法,只能硬著頭皮自己擼一個menu了。 在日常使用中發(fā)現(xiàn)微信的 彈窗菜單 很符合要求,所以就模仿微信來擼一個了。
實現(xiàn)思路
•繼承 PopupWindow 來實現(xiàn)長按彈窗
•獲取當(dāng)前按下 位置,傳給 view 來顯示
具體實現(xiàn)
•第一個很好實現(xiàn),我用的是recyclerView 來實現(xiàn)布局的,而且傳入的資源是 menu。而且另一個好處就是控制某些 item的可見(因為我自己項目中有這樣需求,所以考慮進去了)
private Menu mMenu; @NonNull @SuppressLint("RestrictedApi") public Menu getMenu() { if (mMenu == null) { mMenu = new MenuBuilder(mContext); } return mMenu; } @NonNull public MenuInflater getMenuInflater() { return new MenuInflater(mContext); } public void inflate(@MenuRes int menuRes) { getMenuInflater().inflate(menuRes, getMenu()); }
然后就是填充數(shù)據(jù)到recyclerView中了
•第二個需求,就需要在調(diào)用的Activity 中重寫dispatchTouchEvent獲取當(dāng)前點擊位置,然后傳給 menu 來判斷顯示位置了
private Point mPoint = new Point(); @Override public boolean dispatchTouchEvent(MotionEvent ev) { if (ev.getAction() == MotionEvent.ACTION_DOWN) { mPoint.x = (int) ev.getRawX(); mPoint.y = (int) ev.getRawY(); } return super.dispatchTouchEvent(ev); } public void showPopup(View anchorView, int x, int y) { if (!getMenu().hasVisibleItems()) { return; } //set visible item data int size = getMenu().size(); mMenuItems.clear(); for (int i = 0; i < size; i++) { MenuItem item = getMenu().getItem(i); if (item.isVisible()) { mMenuItems.add(item); } } mMenuAdapter.notifyDataSetChanged(); //show int menuHeight = Display.dip2px(mContext, DEFAULT_ITEM_HEIGHT * mMenuItems.size()); if (x <= mScreenPoint.x / 2) { if (y + menuHeight < mScreenPoint.y) { setAnimationStyle(R.style.Animation_top_left); showAtLocation(anchorView, ANCHORED_GRAVITY, x + X_OFFSET, y); } else { setAnimationStyle(R.style.Animation_bottom_left); showAtLocation(anchorView, ANCHORED_GRAVITY, x + X_OFFSET, y - menuHeight); } } else { if (y + menuHeight < mScreenPoint.y) { setAnimationStyle(R.style.Animation_top_right); showAtLocation(anchorView, ANCHORED_GRAVITY, x - mMenuWidth - X_OFFSET, y); } else { setAnimationStyle(R.style.Animation_bottom_right); showAtLocation(anchorView, ANCHORED_GRAVITY, x - mMenuWidth + X_OFFSET, y - menuHeight); } } }
效果如下
大致思路就是這樣,最后奉上 源碼。
總結(jié)
以上所述是小編給大家介紹的Android 實現(xiàn)微信長按菜單 -FloatMenu,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
Android中使用ViewStub實現(xiàn)布局優(yōu)化
ViewStub是Android布局優(yōu)化中一個很不錯的標簽/控件,直接繼承自View。雖然Android開發(fā)人員基本上都聽說過,但是真正用的可能不多。今天我們就來詳細探討下ViewStub的使用2016-09-09Android 服務(wù)端將位置信息發(fā)送給客戶端的實現(xiàn)
這篇文章主要介紹了Android 服務(wù)端將位置信息發(fā)送給客戶端的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01Android開發(fā)之TabActivity用法實例詳解
這篇文章主要介紹了Android開發(fā)之TabActivity用法,結(jié)合實例形式較為詳細的分析了Android擴展Activity實現(xiàn)標簽頁效果的具體步驟與相關(guān)技巧,需要的朋友可以參考下2016-03-03Android 實例開發(fā)一個學(xué)生管理系統(tǒng)流程詳解
讀萬卷書不如行萬里路,只學(xué)書上的理論是遠遠不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用Java實現(xiàn)一個學(xué)生管理系統(tǒng),大家可以在過程中查缺補漏,提升水平2021-11-11Android應(yīng)用創(chuàng)建多個快捷方式
本文主要介紹Android 生成多個快捷方式,這里提供代碼實例,詳細講解生成多個快捷方式的實現(xiàn)方法,有需要的朋友可以參考下2016-07-07Android studio實現(xiàn)兩個界面間的切換
這篇文章主要為大家詳細介紹了Android studio實現(xiàn)兩個界面間的切換,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-04-04cocos2d-2.0-x-2.0.3 交叉編譯到android報錯解決
我用的是cocos2d-2.0-x-2.0.3 之前弄了一天也沒成功 今天來了下載了最新的ndk8 更新了sdk 又重新是了一遍 居然成功了,不知道是工具的版本問題還是哪一步出錯誤了,在這里詳細的整理一下,感興趣的朋友可以了解下2013-01-01