Android 弹出菜单(类iOS UIMenuController)

PopupMenuView是一个类似iOS的UIMenuController的控件,显示效果如下:

项目地址: https://github.com/kareluo/PopupMenuView

PopupMenuView

用过iOS系统的应该都知道,iOS系统中有一个控件是弹出菜单,就是QQ和微信聊天界面中长按消息那个控件。如下:

UIMenuController

Android 实现

分析来看,可以通过PopupWindow来实现,ContentView为一个LinearLayout包含许多TextView,嗯,不过其样式实现起来就不那么容易了,像是一个气泡一样,那么如何画一个气泡呢?
可以把气泡分为两个部分:一部分是一个圆角矩形,另一部分是一个小三角形。如下:

圆角矩形加三角形

这个很好画,Canvas对象里有很多绘画的方法,但是我们需要将这个组合图形当做一个整体绘制出去,最好的方式是先构造成一个Path,一个简单的气泡组合:

Path triangle = new Path();
triangle.lineTo(32, 0);
triangle.lineTo(16, 16);
triangle.close();

Path path = new Path();
path.addRoundRect(new RectF(0, 0, 100, 32), 16, 16, Path.Direction.CW);
path.addPath(triangle, 16, 32);

气泡和控件如何结合在一起呢?Paint可以设置很多绘制模式,如DST_IN,SRC_IN等。

mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
QQ20161126-1@2x.png

Canvas绘制图案时是分层的,如DST_IN的功能就是绘制上一层和本层的交集部分的上一层内容,这样一来将控件与气泡图案分层绘制,并设置绘制模式,这样就会绘制出气泡样式的控件来,不仅限制于气泡,任何样式都可以实现。也不会影响控件的点击效果,如点击变色等。这也是PopupMenuView的核心实现。

项目地址: https://github.com/kareluo/PopupMenuView

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,631评论 25 709
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,222评论 4 61
  • 简介 ZAB 是 ZooKeeper Atomic Broadcast (ZooKeeper 原子广播协议)的缩写...
    PFF阅读 5,797评论 0 0
  • 孙子有曰,因势利导。 故善战者,求之于势。 不责于人,待敌可胜。 势不可为,势不可当。 势不用尽,顺势而为, 前三...
    泊宁赵阅读 4,023评论 0 2
  • 2008年中考的时候汶川地震,也是这年我们下一届开始九年义务教育免费,这一届开始读研收费,毕业走后开始学校有了...
    大团是晨曦阅读 2,890评论 0 1