最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

在日常開發(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);
  }
 }
 }

效果如下

pic1.png

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

總結(jié)

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

相關(guān)文章

  • Android編程獲取地理位置的經(jīng)度和緯度實(shí)例

    Android編程獲取地理位置的經(jīng)度和緯度實(shí)例

    這篇文章主要介紹了Android編程獲取地理位置的經(jīng)度和緯度實(shí)現(xiàn)方法,結(jié)合實(shí)例形式詳細(xì)分析了Android操作系統(tǒng)服務(wù)調(diào)用GPS實(shí)現(xiàn)定位的相關(guān)技巧,需要的朋友可以參考下
    2016-01-01
  • Android實(shí)現(xiàn)調(diào)用系統(tǒng)分享功能示例的總結(jié)

    Android實(shí)現(xiàn)調(diào)用系統(tǒng)分享功能示例的總結(jié)

    這篇文章主要介紹了通過Android調(diào)用系統(tǒng)分享文本信息、單張圖片、多個文件和指定分享到微信、QQ,同時分享圖片和文字的功能示例,小編覺得挺不錯,一起跟隨小編過來看看吧
    2018-05-05
  • Kotlin作用域函數(shù)應(yīng)用詳細(xì)介紹

    Kotlin作用域函數(shù)應(yīng)用詳細(xì)介紹

    作用域函數(shù):是Kotlin標(biāo)準(zhǔn)庫中的內(nèi)聯(lián)函數(shù),作用在對象上時,執(zhí)行給定的block代碼塊。可以在block代碼塊中通過it,this代表當(dāng)前對象,進(jìn)行代碼邏輯處理
    2022-08-08
  • Android中使用socket使底層和framework通信的實(shí)現(xiàn)方法

    Android中使用socket使底層和framework通信的實(shí)現(xiàn)方法

    native和framework的通信是通過jni,但是這一般只是framework調(diào)用native,native如果有消息要怎樣通知上層 呢?android中GSP模塊提供一種解決思路,但是實(shí)現(xiàn)有些復(fù)雜,這里介紹一種使用socket通信的方法可以使native和framework自由通信,感興趣的朋友一起看看吧
    2016-11-11
  • Android編程實(shí)現(xiàn)二維碼的生成與解析

    Android編程實(shí)現(xiàn)二維碼的生成與解析

    這篇文章主要介紹了Android編程實(shí)現(xiàn)二維碼的生成與解析方法,結(jié)合實(shí)例分析了Android二維碼的生成與讀取二維碼的相關(guān)技巧,并提供了二維碼jar包供讀者下載,需要的朋友可以參考下
    2015-11-11
  • Android控件View打造完美的自定義側(cè)滑菜單

    Android控件View打造完美的自定義側(cè)滑菜單

    這篇文章主要介紹了Android控件View打造完美的自定義側(cè)滑菜單的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • android布局優(yōu)化的一些實(shí)用建議

    android布局優(yōu)化的一些實(shí)用建議

    這篇文章主要給大家介紹了關(guān)于android布局優(yōu)化的一些實(shí)用建議,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • Android自定義View之圓形進(jìn)度條式按鈕

    Android自定義View之圓形進(jìn)度條式按鈕

    本文通過實(shí)例代碼給大家講解了了android自定義view之圓形進(jìn)度條式按鈕的實(shí)例代碼,非常不錯,具有參考借鑒價值,感興趣的朋友一起看下吧
    2016-08-08
  • Android?掃碼槍輸入時屏蔽軟鍵盤和頂部狀態(tài)欄的解決方案

    Android?掃碼槍輸入時屏蔽軟鍵盤和頂部狀態(tài)欄的解決方案

    在Android設(shè)備上,使用掃碼槍時常遇到軟鍵盤和頂部狀態(tài)欄顯示問題,本文介紹了在Android 7.1.2版本上,如何通過設(shè)置inputType為none屏蔽軟鍵盤,以及通過hideStatusBar和NoActionBar方法隱藏頂部狀態(tài)欄,以優(yōu)化掃碼槍使用界面,這些方法有助于提升使用掃碼槍場景的用戶體驗(yàn)
    2024-10-10
  • Android開發(fā)仿掃一掃實(shí)現(xiàn)拍攝框內(nèi)的照片功能

    Android開發(fā)仿掃一掃實(shí)現(xiàn)拍攝框內(nèi)的照片功能

    無論是微信還是支付寶掃一掃功能很常用,那么它基于代碼是如何實(shí)現(xiàn)的呢?今天小編給大家分享android開發(fā)之仿掃一掃實(shí)現(xiàn)拍攝框內(nèi)的照片功能,感興趣的朋友一起學(xué)習(xí)吧
    2016-09-09

最新評論

榆中县| 梓潼县| 蚌埠市| 长沙县| 墨竹工卡县| 五寨县| 高邑县| 平凉市| 葵青区| 西乌| 中超| 九龙城区| 拉萨市| 大方县| 柘城县| 保靖县| 辽阳县| 锦屏县| 峡江县| 福海县| 大姚县| 平和县| 革吉县| 松江区| 饶平县| 政和县| 叶城县| 新野县| 呼和浩特市| 同德县| 双桥区| 沙河市| 遂川县| 富宁县| 广平县| 崇明县| 汉川市| 共和县| 新河县| 瑞金市| 稻城县|