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



作者:kareluo
链接:https://www.jianshu.com/p/df158dfcc5b7
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

更多相关文章

  1. Android实现显示电量的控件代码
  2. Android给图片加文字和图片水印
  3. WebView简介(加速加载篇)
  4. [Android]只显示月和日的DatePickerDialog
  5. Android开发历程_6(RadioButton和CheckBox的使用)
  6. 支付宝转账小demo(不需要库)
  7. Android教程之如何使用自定义字体
  8. Android(安卓)Canvas 绘图
  9. 浅析android 控件listView中的设计模式

随机推荐

  1. android 源码下载403 forbidden, 406 not
  2. Android WIFI 分析
  3. Android 自定义缩短Toast显示时间
  4. [Android]Log打印
  5. Android 带进度条自动下载Apk并自动安装
  6. 我的Android进阶之旅------>Android利用S
  7. Android音频相关源码中的基本概念如采样
  8. android 滚动视图(ScrollView)学习与应用
  9. [odroid-pc]ubuntu12.04 android adb she
  10. android新开发语言Kotlin的入手Demo