bl双性强迫侵犯h_国产在线观看人成激情视频_蜜芽188_被诱拐的少孩全彩啪啪漫画

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

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

創(chuàng)新互聯(lián)建站于2013年成立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元南靖做網(wǎng)站,已為上家服務(wù),為南靖各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:13518219792

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

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

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

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

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

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

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

•第二個(gè)需求,就需要在調(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 實(shí)現(xiàn)微信長(zhǎng)按菜單 -FloatMenu

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

總結(jié)

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

當(dāng)前名稱:Android實(shí)現(xiàn)微信長(zhǎng)按菜單-FloatMenu
文章地址:http://vcdvsql.cn/article16/gjccgg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航、品牌網(wǎng)站建設(shè)手機(jī)網(wǎng)站建設(shè)網(wǎng)站排名、用戶體驗(yàn)、ChatGPT

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司