国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android 實(shí)現(xiàn)微信長按菜單 -FloatMenu

2019-10-21 21:46:54
字體:
供稿:網(wǎng)友

在日常開發(fā)中,長按某個view出現(xiàn)個菜單是很常見的需求,Google 也給我們提供了一些組件來實(shí)現(xiàn),比如PopupMenu。但是在實(shí)際使用中還是發(fā)現(xiàn)他無法滿足我們的所有需求。

比如:產(chǎn)品要求長按菜單出現(xiàn)在手指按下的位置,額 這就頭疼了,PopupMenu只能展示在view的底部或者頭部。還有個問題如果你的view過長超過一屏,那么 PopupMenu 就無法顯示在屏幕里了。

所以沒辦法,只能硬著頭皮自己擼一個menu了。 在日常使用中發(fā)現(xiàn)微信的 彈窗菜單 很符合要求,所以就模仿微信來擼一個了。

實(shí)現(xiàn)思路

•繼承 PopupWindow 來實(shí)現(xiàn)長按彈窗

•獲取當(dāng)前按下 位置,傳給 view 來顯示

具體實(shí)現(xiàn)

•第一個很好實(shí)現(xiàn),我用的是recyclerView 來實(shí)現(xiàn)布局的,而且傳入的資源是 menu。而且另一個好處就是控制某些 item的可見(因?yàn)槲易约喉?xiàng)目中有這樣需求,所以考慮進(jìn)去了)

 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)前點(diǎn)擊位置,然后傳給 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);  } } }

效果如下

Android,微信長按菜單,FloatMenu

大致思路就是這樣,最后奉上 源碼

總結(jié)

以上所述是小編給大家介紹的Android 實(shí)現(xiàn)微信長按菜單 -FloatMenu,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對VEVB武林網(wǎng)網(wǎng)站的支持!


注:相關(guān)教程知識閱讀請移步到Android開發(fā)頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 武清区| 株洲县| 石楼县| 天水市| 麻阳| 康定县| 满洲里市| 禄丰县| 丹东市| 永安市| 齐河县| 海晏县| 龙江县| 辽宁省| 永平县| 建昌县| 慈溪市| 九江市| 永安市| 太保市| 隆子县| 达日县| 昌图县| 石家庄市| 古蔺县| 驻马店市| 马关县| 辽中县| 岑溪市| 铁力市| 怀化市| 定州市| 额尔古纳市| 宣武区| 西乌珠穆沁旗| 新蔡县| 清苑县| 蚌埠市| 武山县| 嘉荫县| 开封市|