如何实现android炫酷悬浮球菜单

本文介绍了一种酷炫的悬浮球菜单实现方法,利用WindowManager进行布局切换,并通过动画增强用户体验。提供了两种实现思路对比及具体实现步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

悬浮球菜单这件事,很多篇文章都有讲过,那为什么我还要再写一篇呢?因为我觉得我们的实现比较酷炫,另外有必要总结下实现的思路,供大家来参考。毕竟做什么事,思路先行,如果没有思路,只会复制粘贴代码,那和咸鱼有什么区别?

效果预览

全能分词 悬浮球效果预览











思考

首先我们实现悬浮球时,WindowManager是离不开的,对它的用法可以自行360搜索。可以看到我们的悬浮球是有二级目录的,存在着两个不同的view之间的相互切换。对于这两级切换,大致实现有两种方式:

1.只使用一个布局文件,其中的元素通过 gone 或 visiable 来实现显示或隐藏。这样做的好处是统一在一个布局中处理,但是坏处也很明显,一要随着切换要自行控制LayoutParam 属性,保证所有的view都可以显示完全,另外则是需要把逻辑放到一个view里面,如果你写 代码的习惯不好,不懂得模块化,写出的东西会非常难看。

2.使用两个布局,通过按钮点击来向WindowManager中添加和移除view,这样显然没有了上面的坏处了,但是你还需要计算,保证两个view的中心点的位置是重合的,不然,一上一下的,你看着也难受,是吧。
so,我们采用了第二种实现方式,这样整个控件的书写可以分为以下四个步骤:


1>实现美女图片iocn到展开布局的切换,也就一个点击事件。


2>实现展开布局的动画与布局,哈哈,这部分有点复杂,不过封装的还可以,对照源码应该看得懂。


3>实现在屏幕不同位置时,展开布局的变化。


4>展开前中心点与展开后中心点位置重合计算。```
# 实现
具体的实现可以参考源码:[ArcTipViewController](https://github.com/l465659833/Bigbang/blob/master/app/src/main/java/com/forfan/bigbang/util/ArcTipViewController.java),没墙github 真的是祖国的良心。
这里也贴下部分的代码实现:


![展开时源码实现](http://upload-images.jianshu.io/upload_images/22193-a24c550dc663ff64.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)


![显示美女icon实现](http://upload-images.jianshu.io/upload_images/22193-bf24594b7a6a692e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
参考源代码阅读本文,风味更佳哦。
# 链接
* [全能分词开源](https://github.com/l465659833/Bigbang/)


* [Apk下载地址](http://zhushou.360.cn/detail/index/soft_id/3539904)


* [Google Play 下载地址](https://play.google.com/store/apps/details?id=com.forfan.bigbang)


作者:王岩_shang
链接:https://www.jianshu.com/p/56abca9fb592
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


作者:王岩_shang
链接:https://www.jianshu.com/p/56abca9fb592
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Android 悬浮菜单,可在launcher或app中使用。示例代码:@Override public void onCreate() {     super.onCreate();     mFloatMenu = new FloatMenu.Builder(this)             .floatLoader(R.drawable.yw_anim_background)             .floatLogo(R.drawable.yw_image_float_logo)             .addMenuItem(android.R.color.transparent, R.drawable.yw_menu_account, Const.MENU_ITEMS[0], android.R.color.black, this)             .addMenuItem(android.R.color.transparent, R.drawable.yw_menu_favour, Const.MENU_ITEMS[1], android.R.color.black, this)             .addMenuItem(android.R.color.transparent, R.drawable.yw_menu_fb, Const.MENU_ITEMS[2], android.R.color.black, this)             .addMenuItem(android.R.color.transparent, R.drawable.yw_menu_msg, Const.MENU_ITEMS[3], android.R.color.black, this)             .addMenuItem(android.R.color.transparent, R.drawable.yw_menu_close, Const.MENU_ITEMS[4], android.R.color.black, this)             .menuBackground(R.drawable.yw_menu_bg)             .onMenuActionListner(this)             .build();     mFloatMenu.show(); } public void showFloat() {     if (mFloatMenu != null)         mFloatMenu.show(); } public void hideFloat() {     if (mFloatMenu != null) {         mFloatMenu.hide();     } } public void destroyFloat() {     hideFloat();     if (mFloatMenu != null) {         mFloatMenu.destroy();     }     mFloatMenu = null; }  private void showRed() {     if (!hasNewMsg) {         mFloatMenu.changeLogo(R.drawable.yw_image_float_logo, R.drawable.yw_menu_msg, 3);     } else {         mFloatMenu.changeLogo(R.drawable.yw_image_float_logo_red, R.drawable.yw_menu_msg_red, 3);     } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值