亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時(shí)間:2018年07月16日 09:24:15   作者:JokAr-  
在日常開(kāi)發(fā)中,長(zhǎng)按某個(gè)view出現(xiàn)個(gè)菜單是很常見(jiàn)的需求,下面小編給大家?guī)?lái)了Android 實(shí)現(xiàn)微信長(zhǎng)按菜單 -FloatMenu的實(shí)現(xiàn)思路及具體實(shí)現(xiàn)代碼,感興趣的朋友跟隨腳本之家小編一起看看吧

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

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

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

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

•繼承 PopupWindow 來(lái)實(shí)現(xiàn)長(zhǎng)按彈窗

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

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

•第一個(gè)很好實(shí)現(xiàn),我用的是recyclerView 來(lái)實(shí)現(xiàn)布局的,而且傳入的資源是 menu。而且另一個(gè)好處就是控制某些 item的可見(jiàn)(因?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中了

•第二個(gè)需求,就需要在調(diào)用的Activity 中重寫(xiě)dispatchTouchEvent獲取當(dāng)前點(diǎn)擊位置,然后傳給 menu 來(lái)判斷顯示位置了

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);
  }
 }
 }

效果如下

pic1.png

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

總結(jié)

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

相關(guān)文章

  • PowerManagerService之亮屏流程示例分析

    PowerManagerService之亮屏流程示例分析

    這篇文章主要為大家介紹了PowerManagerService之亮屏流程示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • Android中使用ViewStub實(shí)現(xiàn)布局優(yōu)化

    Android中使用ViewStub實(shí)現(xiàn)布局優(yōu)化

    ViewStub是Android布局優(yōu)化中一個(gè)很不錯(cuò)的標(biāo)簽/控件,直接繼承自View。雖然Android開(kāi)發(fā)人員基本上都聽(tīng)說(shuō)過(guò),但是真正用的可能不多。今天我們就來(lái)詳細(xì)探討下ViewStub的使用
    2016-09-09
  • Android 服務(wù)端將位置信息發(fā)送給客戶端的實(shí)現(xiàn)

    Android 服務(wù)端將位置信息發(fā)送給客戶端的實(shí)現(xiàn)

    這篇文章主要介紹了Android 服務(wù)端將位置信息發(fā)送給客戶端的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Android開(kāi)發(fā)之TabActivity用法實(shí)例詳解

    Android開(kāi)發(fā)之TabActivity用法實(shí)例詳解

    這篇文章主要介紹了Android開(kāi)發(fā)之TabActivity用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Android擴(kuò)展Activity實(shí)現(xiàn)標(biāo)簽頁(yè)效果的具體步驟與相關(guān)技巧,需要的朋友可以參考下
    2016-03-03
  • Android 實(shí)例開(kāi)發(fā)一個(gè)學(xué)生管理系統(tǒng)流程詳解

    Android 實(shí)例開(kāi)發(fā)一個(gè)學(xué)生管理系統(tǒng)流程詳解

    讀萬(wàn)卷書(shū)不如行萬(wàn)里路,只學(xué)書(shū)上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用Java實(shí)現(xiàn)一個(gè)學(xué)生管理系統(tǒng),大家可以在過(guò)程中查缺補(bǔ)漏,提升水平
    2021-11-11
  • Android應(yīng)用創(chuàng)建多個(gè)快捷方式

    Android應(yīng)用創(chuàng)建多個(gè)快捷方式

    本文主要介紹Android 生成多個(gè)快捷方式,這里提供代碼實(shí)例,詳細(xì)講解生成多個(gè)快捷方式的實(shí)現(xiàn)方法,有需要的朋友可以參考下
    2016-07-07
  • Android實(shí)現(xiàn)滑動(dòng)到頂部懸停的效果

    Android實(shí)現(xiàn)滑動(dòng)到頂部懸停的效果

    這篇文章給大家介紹一種不常見(jiàn)的實(shí)現(xiàn)Android滑動(dòng)到頂部懸停效果的方式,對(duì)大家開(kāi)發(fā)Android具有一定的參考借鑒價(jià)值,有需要的朋友們可以來(lái)一起看看。
    2016-09-09
  • Android studio實(shí)現(xiàn)兩個(gè)界面間的切換

    Android studio實(shí)現(xiàn)兩個(gè)界面間的切換

    這篇文章主要為大家詳細(xì)介紹了Android studio實(shí)現(xiàn)兩個(gè)界面間的切換,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • cocos2d-2.0-x-2.0.3 交叉編譯到android報(bào)錯(cuò)解決

    cocos2d-2.0-x-2.0.3 交叉編譯到android報(bào)錯(cuò)解決

    我用的是cocos2d-2.0-x-2.0.3 之前弄了一天也沒(méi)成功 今天來(lái)了下載了最新的ndk8 更新了sdk 又重新是了一遍 居然成功了,不知道是工具的版本問(wèn)題還是哪一步出錯(cuò)誤了,在這里詳細(xì)的整理一下,感興趣的朋友可以了解下
    2013-01-01
  • Android畫(huà)中畫(huà)窗口開(kāi)啟方法

    Android畫(huà)中畫(huà)窗口開(kāi)啟方法

    Android8.0 Oreo(API Level26)允許活動(dòng)啟動(dòng)畫(huà)中畫(huà)Picture-in-picture(PIP)模式。PIP是一種特殊類型的多窗口模式,主要用于視頻播放。PIP模式已經(jīng)可用于Android TV,而Android8.0則讓該功能可進(jìn)一步用于其他Android設(shè)備
    2023-01-01

最新評(píng)論