服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Android - Android 实现微信长按菜单 -FloatMenu

Android 实现微信长按菜单 -FloatMenu

2022-07-14 09:18JokAr- Android

在日常开发中,长按某个view出现个菜单是很常见的需求,下面小编给大家带来了Android 实现微信长按菜单 -FloatMenu的实现思路及具体实现代码,感兴趣的朋友跟随脚本之家小编一起看看吧

在日常开发中,长按某个view出现个菜单是很常见的需求,Google 也给我们提供了一些组件来实现,比如PopupMenu。但是在实际使用中还是发现他无法满足我们的所有需求。

比如:产品要求长按菜单出现在手指按下的位置,额 这就头疼了,PopupMenu只能展示在view的底部或者头部。还有个问题如果你的view过长超过一屏,那么 PopupMenu 就无法显示在屏幕里了。

所以没办法,只能硬着头皮自己撸一个menu了。 在日常使用中发现微信的 弹窗菜单 很符合要求,所以就模仿微信来撸一个了。

实现思路

•继承 PopupWindow 来实现长按弹窗

•获取当前按下 位置,传给 view 来显示

具体实现

•第一个很好实现,我用的是recyclerView 来实现布局的,而且传入的资源是 menu。而且另一个好处就是控制某些 item的可见(因为我自己项目中有这样需求,所以考虑进去了)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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());
}

然后就是填充数据到recyclerView中了

•第二个需求,就需要在调用的Activity 中重写dispatchTouchEvent获取当前点击位置,然后传给 menu 来判断显示位置了

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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

大致思路就是这样,最后奉上 源码

总结

以上所述是小编给大家介绍的Android 实现微信长按菜单 -FloatMenu,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!

原文链接:https://blog.csdn.net/a1018875550/article/details/81046259

延伸 · 阅读

精彩推荐
  • AndroidAndroid编程之SurfaceView实例详解

    Android编程之SurfaceView实例详解

    这篇文章主要介绍了Android编程之SurfaceView用法,简要分析了View和SurfaceView的区别,并结合实例形式分析了SurfaceView的具体使用步骤与相关技巧,需要的朋友可以...

    xurong7232021-05-31
  • AndroidAndroid对话框AlertDialog.Builder使用方法详解

    Android对话框AlertDialog.Builder使用方法详解

    这篇文章主要介绍了Android对话框AlertDialog.Builder使用方法详解的相关资料,需要的朋友可以参考下...

    高杰才_Android9372021-06-23
  • Android简单实现Android学生管理系统(附源码)

    简单实现Android学生管理系统(附源码)

    这篇文章主要介绍了如何简单实现Android学生管理系统,特别适合计算机专业的即将毕业的同学学习借鉴制作学生管理系统,感兴趣的小伙伴们可以参考一下...

    徐刘根6072021-04-20
  • AndroidAndroid 编程下的计时器代码

    Android 编程下的计时器代码

    在安卓 APP 的手机号注册逻辑中,经常会有将激活码发送到手机的环节,这个环节中绝大多数的应用考虑到网络延迟或服务器压力以及短信服务商的延迟等...

    Android开发网9372021-02-04
  • AndroidAndroid实现图片异步加载并缓存到本地

    Android实现图片异步加载并缓存到本地

    这篇文章主要介绍了Android实现图片异步加载并缓存到本地的相关资料,需要的朋友可以参考下...

    Android开发网7272021-06-07
  • AndroidAndroid中如何利用AIDL机制调用远程服务

    Android中如何利用AIDL机制调用远程服务

    这篇文章主要介绍了Android中如何利用AIDL机制调用远程服务的相关资料,需要的朋友可以参考下...

    水火3797052021-06-28
  • Android浅析Android.mk

    浅析Android.mk

    Android.mk是Android提供的一种makefile文件,用来指定诸如编译生成so库名、引用的头文件目录、需要编译的.c/.cpp文件和.a静态库文件等。要掌握jni,就必须熟练...

    ly13142012182021-05-08
  • AndroidAndroid中的Handler与多线程应用实例

    Android中的Handler与多线程应用实例

    这篇文章主要介绍了Android中的Handler与多线程应用实例,本文首先解释一下handler是用来干嘛的,然后通过例子介绍其在多线程中的应用,需要的朋友可以参考下...

    Android开发网11842021-03-15