仿360悬浮窗——进阶篇

上一章讲了仿360基础篇,这一章在基础上做一下功能的拓展,如果你需要做成像360一样的东西,可以在我源码基础上修改即可,当然如果你做launcher开发,也可以做成苹果手机那样的悬浮快捷按钮,还是老规矩,先贴图(两种效果):
这一次加了一个大的悬浮窗,用来处理复杂需求,我只是随便画了个圆形,你们可以做的更漂亮,功能更强大:
对于悬浮框的建立,我上一章已经见过,这里就不多做讲解,请参考:仿360悬浮窗基础版
因为有一大一小两个悬浮窗,我们不妨建立一个WindowManger来管理两个悬浮窗加载的状态,代码如下(注意SmallWindow和BigWindow创立时的差别):
public class FloatWindowManager {/*** 小悬浮窗*/private static FloatWindowSmall smallWindow;/*** 大悬浮窗*/private static FloatWindowBig bigWindow;/*** 小悬浮窗的params*/private static LayoutParams smallWindowParams;/*** 大悬浮窗的params*/private static LayoutParams bigWindowParams;/*** 用于控制在屏幕上添加或移除悬浮窗*/private static WindowManager mWindowManager;/*** 创建一个小悬浮窗。初始位置为屏幕的右部中间位置。** @param context 必须为应用程序的Context.*/public static void createSmallWindow(Context context) {WindowManager windowManager = getWindowManager(context);DisplayMetrics dm = new DisplayMetrics();windowManager.getDefaultDisplay().getMetrics(dm);if (smallWindow == null) {//这里必须先初始化小悬浮窗smallWindow = new FloatWindowSmall(context);if (smallWindowParams == null) {smallWindowParams = new LayoutParams();smallWindowParams.type = LayoutParams.TYPE_PHONE;smallWindowParams.format = PixelFormat.RGBA_8888;//如何不加这个,则会出现它一直霸占焦点,其他点击事件失效,切记smallWindowParams.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL| LayoutParams.FLAG_NOT_FOCUSABLE;smallWindowParams.gravity = Gravity.LEFT | Gravity.TOP;//这里相当于确定起点位置smallWindowParams.width = FloatWindowSmall.viewWidth;smallWindowParams.height = FloatWindowSmall.viewHeight;smallWindowParams.x = dm.widthPixels;smallWindowParams.y = dm.heightPixels / 2 - smallWindowParams.height / 2;}smallWindow.setParams(smallWindowParams);windowManager.addView(smallWindow, smallWindowParams);}}/*** 将小悬浮窗从屏幕上移除。** @param context 必须为应用程序的Context.*/public static void removeSmallWindow(Context context) {if (smallWindow != null) {WindowManager windowManager = getWindowManager(context);windowManager.removeView(smallWindow);smallWindow = null;}}/*** 创建一个大悬浮窗。位置根据小悬浮窗确定。** @param context 必须为应用程序的Context.*/public static void createBigWindow(Context context) {WindowManager windowManager = getWindowManager(context);DisplayMetrics dm = new DisplayMetrics();windowManager.getDefaultDisplay().getMetrics(dm);if (bigWindow == null) {//这里必须先初始化大悬浮窗bigWindow = new FloatWindowBig(context);}//参数是变动的,所以每一次开启都必须更新bigWindowParams = new LayoutParams();bigWindowParams.type = LayoutParams.TYPE_PHONE;bigWindowParams.format = PixelFormat.RGBA_8888;bigWindowParams.gravity = Gravity.LEFT | Gravity.TOP;bigWindowParams.width = FloatWindowBig.viewWidth;bigWindowParams.height = FloatWindowBig.viewHeight;//如何不加这个,则会出现它一直霸占焦点,其他点击事件失效,切记bigWindowParams.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL| LayoutParams.FLAG_NOT_FOCUSABLE;//这里是根据小悬浮窗的位置来确定大悬浮窗的位置,当然我们这里强制聚焦,所以屏蔽掉
//        bigWindowParams.x = FloatWindowSmall.smallParams.x + FloatWindowSmall.viewWidth -
//                bigWindowParams.width;
//        bigWindowParams.y = FloatWindowSmall.smallParams.y + FloatWindowSmall.viewHeight / 2
//                - bigWindowParams.height / 2;//如果你想实现类似苹果手机的快捷操作悬浮窗效果,可以让他显示在中间位置bigWindowParams.x = dm.widthPixels/2 - bigWindowParams.width/2;bigWindowParams.y = dm.heightPixels/2 - bigWindowParams.height /2;windowManager.addView(bigWindow, bigWindowParams);}/*** 将大悬浮窗从屏幕上移除。** @param context 必须为应用程序的Context.*/public static void removeBigWindow(Context context) {if (bigWindow != null) {WindowManager windowManager = getWindowManager(context);windowManager.removeView(bigWindow);bigWindow = null;}}/*** 更新小悬浮窗的TextView上的数据,显示内存使用的百分比。*/public static void updateUsedPercent() {if (smallWindow != null) {TextView percentView = (TextView) smallWindow.findViewById(R.id.percent);percentView.setText(smallWindow.getUsedPercentValue());}}/*** 是否有悬浮窗(包括小悬浮窗和大悬浮窗)显示在屏幕上。** @return 有悬浮窗显示在桌面上返回true,没有的话返回false。*/public static boolean isWindowShowing() {return smallWindow != null || bigWindow != null;}/*** @param context 必须为getApplicationContext().* @return WindowManager的实例*/private static WindowManager getWindowManager(Context context) {if (mWindowManager == null) {mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);}return mWindowManager;}
}

至于悬浮窗,一大一小,小的上一章见过了,就不贴代码呢,我会上传整个源码,所以不要担心学不会,主要我不喜欢我的博客篇幅太长,还是讲思路和主要代码,大悬浮窗,代码很简单:

public class FloatWindowBig extends LinearLayout {/*** 记录大悬浮窗的宽度*/public static int viewWidth;/*** 记录大悬浮窗的高度*/public static int viewHeight;public FloatWindowBig(final Context context) {super(context);LayoutInflater.from(context).inflate(R.layout.float_window_big, this);View view = findViewById(R.id.big_window_layout);viewWidth = view.getLayoutParams().width;viewHeight = view.getLayoutParams().height;TextView close = (TextView) findViewById(R.id.close);TextView back = (TextView) findViewById(R.id.back);close.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// 点击关闭悬浮窗的时候,移除所有悬浮窗,并停止ServiceFloatWindowManager.removeBigWindow(context);FloatWindowManager.removeSmallWindow(context);Intent intent = new Intent(getContext(), FloatWindowService.class);context.stopService(intent);}});back.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// 点击返回的时候,移除大悬浮窗,创建小悬浮窗FloatWindowManager.removeBigWindow(context);FloatWindowManager.createSmallWindow(context);}});}
}

最后就是service部分,直接调用FloatWindowManager的方法创建大小悬浮窗即可,这里需要做的是判断用户界面是否在laucher,当然如果模仿苹果手机的功能悬浮快捷按钮则不需要,代码如下:

<span style="white-space:pre"> </span>/*** 判断当前界面是否是桌面*/private boolean isHome() {ActivityManager mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);List<RunningTaskInfo> rti = mActivityManager.getRunningTasks(1);return getHomes().contains(rti.get(0).topActivity.getPackageName());}/*** 获得属于桌面的应用的应用包名称** @return 返回包含所有包名的字符串列表*/private List<String> getHomes() {List<String> names = new ArrayList<String>();PackageManager packageManager = this.getPackageManager();Intent intent = new Intent(Intent.ACTION_MAIN);intent.addCategory(Intent.CATEGORY_HOME);List<ResolveInfo> resolveInfo = packageManager.queryIntentActivities(intent,PackageManager.MATCH_DEFAULT_ONLY);for (ResolveInfo ri : resolveInfo) {names.add(ri.activityInfo.packageName);}return names;}

因为只是针对上一章做一下功能拓展,方便大家用于自己项目,所以没有太多思路可讲,效果图已经呈现,相信大家最需要的还是源码:360悬浮窗——进阶篇

仿360悬浮窗——进阶篇相关推荐

  1. 【Android 学习】实现仿360悬浮窗

    本篇博客转自郭霖的博客http://blog.csdn.net/guolin_blog/article/details/8689140 360手机卫士我相信大家都知道,好多人手机上都会装这一款软件,那 ...

  2. iOS高仿微信悬浮窗、忍者小猪游戏、音乐播放器、支付宝、今日头条布局滚动效果等源码...

    iOS精选源码 iOS WKWebView的使用源码 模仿apple music 小播放器的交互实现 高仿微信的悬浮小窗口 iOS仿支付宝首页效果 [swift]仿微信悬浮窗 类似于今日头条,网易新闻 ...

  3. android 仿360浮动,Android仿360悬浮小球自定义view实现示例

    Android仿360悬浮小球自定义view实现示例 效果图如下: 实现当前这种类似的效果 和360小球 悬浮桌面差不错类似.这种效果是如何实现的呢.废话不多说 ,直接上代码. 1.新建工程,添加悬浮 ...

  4. Android模仿360动态悬浮窗,像360悬浮窗那样,用WindowManager实现炫酷的悬浮迷你音乐盒(下)...

    悬浮窗 在上一篇文章像360悬浮窗那样,用WindowManager实现炫酷的悬浮迷你音乐盒(上)中我粗粗的向大家介绍了WindowManager和WindowManager.LayoutParams ...

  5. 像360悬浮窗那样,用WindowManager做一个炫酷的悬浮迷你音乐盒(下)

    *本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 在上一篇文章像360悬浮窗那样,用WindowManager实现炫酷的悬浮迷你音乐盒(上)中我粗粗的向大家介绍了WindowMan ...

  6. 像360悬浮窗那样,用WindowManager实现炫酷的悬浮迷你音乐盒(下)

    悬浮窗 在上一篇文章像360悬浮窗那样,用WindowManager实现炫酷的悬浮迷你音乐盒(上)中我粗粗的向大家介绍了WindowManager和WindowManager.LayoutParams ...

  7. android悬浮球代码,Android 仿360悬浮球与加速球

    先来看一张动态图 昨天跟着视频学了如何自定义View并做成仿360悬浮球与加速球的样式 可以看出来,做成的效果有: 点击按钮后退出Activity,呈现一个圆形的悬浮球,可以随意拖动并会自动依靠到屏幕 ...

  8. android 悬浮球动画,Android 仿360悬浮球与加速球

    先来看一张动态图 昨天跟着视频学了如何自定义View并做成仿360悬浮球与加速球的样式 可以看出来,做成的效果有: 点击按钮后退出Activity,呈现一个圆形的悬浮球,可以随意拖动并会自动依靠到屏幕 ...

  9. android 仿ios悬浮窗,iOS仿微信悬浮窗

    仿微信悬浮窗,可直接协议加入悬浮窗或者直接调用方法注册,可自定义转场动画 演示 myFloat.gif 用法1 在Appdelegate中注册 传入对应控制器的className //只带控制器的cl ...

  10. Android桌面悬浮窗进阶,QQ手机管家小火箭效果实现

    这次我们将代码的重点放在火箭升空的效果上,因此简单起见,就直接在模仿360手机卫士悬浮窗的那份代码的基础上继续开发了,如果你还没有看过那篇文章的话,建议先去阅读 Android桌面悬浮窗效果实现,仿3 ...

最新文章

  1. 2021-2027年中国透明熔融石英管行业市场全景调查及投资前景分析报告
  2. 「图像分类」从数据集和经典网络开始
  3. ORCAD常用元件库说明
  4. Linux 用户和组
  5. 5 SU01给用户增加权限
  6. 【janio】janio ClassBodyEvaluator 的使用
  7. 【Java】关于学习while do-while for循环知识点的总结
  8. 基于Linux的嵌入式文件系统构建与设计
  9. 生成android toolchain
  10. 网络安全系列-XI: 主流网络协议介绍
  11. FFMPEG开发之——视频转码
  12. 怎么让热图显示基因名_教你画一个掰弯的热图(Heatmap),展示更多的基因表达量...
  13. 几种kafka多线程消费方式
  14. python运行调出控制台_python控制台怎么打开
  15. 南宁装修工长带队,价格公道不乱增加项目
  16. psid mysql_eclipse连接MYSQL,保存数据到mysql里,哪出错了?
  17. 木马也办“假身份证” 数字签名面临信任危机
  18. 《茶馆》再开张 这出戏濮存昕、冯远征演了20年
  19. 办理测绘资质所需流程以及材料(2022最新)
  20. Chromatix 7 使用<2>

热门文章

  1. 【java导出PDF】
  2. 你必须会的微服务之Hystrix熔断器
  3. als算法参数_spark ALS算法
  4. 买房? 上区块链, 安排! 全国首张不动产区块链电子凭证诞生
  5. ElasticSearch配合mysql实现同义词热更新
  6. PLC控制系统怎么抗干扰
  7. 读书笔记—中国跑步指南
  8. 目前为止最靠谱的禁用windows10update易升自动更新的办法
  9. 我的前端“先行”之路
  10. 腾讯云TCA运维工程师认证题库及例题示范