Android Launcher负一屏实现方案@TOC

  1. 整体方案:
    利用Google Feed屏方案, 基于Google定义的ILauncherOverlay和 ILauncherOverlayCallback两个接口,通过AIDL通信方式实现。 Launcher作为客户端, 负一屏是独立的应用作为服务端。
    Launcher将其Activity的window属性和滑动信息传递给应用端。应用端根据Launcher窗口属性创建一个相同属性的窗口,以WindowManager.addView方式添加此浮动窗口,并根据Launcher传递过来的滑动信息,用translationX改变负一屏View的位置来实现窗口的顺势进入显示区和滑出显示区的效果。

  2. 方案有缺点:
    缺点:实现复杂,需要应用自己实现View显示滑动等处理。
    优点:与Launcher解构,虽然负一屏的显示依赖launcher的activity的token,但运行在独立的进程中,不影响Launcher性能。

  3. 具体实现过程:
    客户端Launcher的实现:
    1)客户端实现ILauncherOverlayCallback接口。

  • 接口函数overlayScrollChanged由服务端回调,参数为服务端窗口的移动进度,launcher根据此值让workspace做相应的translationX,达到和应用负一屏窗口联动的功能。
  • 接口函数overlayStatusChanged由服务端回调,通知Launcher端,服务端的Overlay的状态,1-表示状态已打开, 0-表示已关闭。状态打开时, Launcher要对应处理overlayScrollChanged的滑动过程。
    2)Launcher在onAttachedToWindow的时候,会通过windowAttached(WindowManager.LayoutParams attrs, ILauncherOverlayCallback callbacks, int options)方法,将Launcher的Activity的window属性,和launcher实例化出来的ILauncherOverlayCallback.Stub回调传给服务端。
    Sample code:
WindowManager.LayoutParams lp = getWindow().getAttributes();
windowAttached(lp, loverlayCb, 0);

3)用户在屏幕的滑动操作, 调用startScroll(), onScroll(float progress), endScroll()来通知服务端。
4)Launcher这边打开关闭负一屏,用openOverlay(),closeOverlay()来通知服务端。
5)Launcher 在onResume(), onPause()时通知服务端, 以保证Launcher和服务端同步生命周期。

服务端App的实现:
1)应用端创建一个服务,实现ILauncherOverlay接口。接口功能主要实现以下函数:

2)在客户端调用服务端的windowAttached的时候,创建一个Window, 将客户端的LayoutParams中的部分属性赋值给服务端的window。

到此,就可以在launcher的上层显示一个负一屏的window了,如果不给负一屏容器设置一个translationX的话,默认该window是盖在launcher上的,可以通过设置translationX的默认值将其默认显示在屏幕以外。
3)服务端接收到onScroll(float progress)传过来的scroll值,来改变负一屏window中的view的translationX,来达到负一屏滑动的效果。
4)服务端接收到客户端的closeOverlay和openOverlay时,也要对应处理负一屏的显示与隐藏。比如Launcher端执行onNewIntent()时,会调用closeOverlay来进行Launcher主页面的显示,并隐藏负一屏。
5)服务端window上的View需要处理onTouchEvent事件,判断滑动距离,计算滑动进度,要通过ILauncherOverlayCallback接口将滑动进度回调给Launcher,以达到Launcher与负一屏联动效果。
比如,如果是以dialog形式创建的窗口,需要自定义类继承Dialog,重写onTouchEvent函数, 来处理滑动事件过程。

Android Launcher负一屏实现方案相关推荐

  1. Android桌面负一屏实现.md

    Android桌面负一屏实现 负一屏的实现主流有两种方式 Launcher自行开发,往Workspace中插入一个自定义的CellLayout来作为负一屏的容器. 这种方式是最常用的方案. 利用Goo ...

  2. android 兼容所有刘海屏的方案大全

    转载请标明出处: https://blog.csdn.net/DJY1992/article/details/80689632 本文出自:[奥特曼超人的博客] 推荐: - ios兼容iphonex刘海 ...

  3. android负一屏实现方案

    方案一: 桌面自行开发,可以快速完美的加入负一屏,但是当负一屏的业务越来越多时,会拖累launcher的性能,内存等. 方案二: Launcher利用反射调用负一屏APP里的类和方法创建View. 缺 ...

  4. Launcher负一屏(二)----引入其它资源替换Google原生负一屏界面

    负一屏有两种实现方式 1.Launcher自行开发,往Workspace中插入一个自定义的CellLayout来作为负一屏的容器. 具体请参考之前的文章:https://blog.csdn.net/a ...

  5. Launcher负一屏---创建和添加流程

    负一屏整体框架 目录 负一屏整体框架 负一屏创建时机 1.workspace页面顺序 2.负一屏的加入和view的填充 负一屏创建时机 负一屏的创建在Launcher.java的bindScreens ...

  6. android 桌面负一屏,全局负一屏高级版

    全局负一屏高级版是一款安卓手机桌面软件,能够帮助用户开启一些桌面的小工具,比如悬浮窗,还有音量调节器等等,帮助用户随时可以添加一些系统部件功能,让手机操作更加便捷,需要的伙伴,可以在西西下载哦! 全局 ...

  7. Android 8刘海屏特性,Android 8.0刘海屏适配方案 小米和华为根据官方api即可获取隐藏显示转态,oppo和Vivo没有公开API...

    /** * @return 判断Android O的刘海屏 */ private boolean hasNotchInScreen() { boolean ret_all = false; ret_h ...

  8. Android app启动白屏适配方案

    至于app启动时候为什么会白屏,咱们不多赘述,相关的文章以及启动时间优化文章多了去了.咱们这里主要讲述优化完成后如何解决白屏问题. app启动时候黑屏或者白屏是还没加载到布局文件,就已经显示了wind ...

  9. Launcher桌面负一屏实现 第一章

    Android Launcher负一屏实现 负一屏的实现主流有两种方式 Launcher自行开发,往Workspace中插入一个自定义的CellLayout来作为负一屏的容器. 这种方式是最常用的方案 ...

  10. 【学以致用】android功能实现9---Launcher之AS中,在Launcher源码中增加google负一屏的实现方法

    负一屏是相对于正常屏幕而言,正常屏幕是指桌面上用户用于摆放图标(也可以编辑图标位置)的屏幕,根据用户喜欢可以有一个或多个屏幕.在一些手机当中,包括苹果和安卓,在正常屏幕的最左边一屏,我们再往左滑,会出 ...

最新文章

  1. 求s = k ! + n ! / m !的值
  2. 不同系统之间数据的交互
  3. 为什么优秀的程序员都写博客?谈谈我都是如何写作的
  4. c++ 获取linux系统信息_linux系统c程序移植
  5. iOS四种多线程(swift和oc)
  6. 栏目图片 栏目描述_昕街拍|长期福利栏目来啦,秀街拍赢礼品!
  7. 2016 ICPC 北京网络赛 A 恶心模拟 F 循环矩阵,FFT(待补) I 模拟
  8. 仅对此用户禁用 java_Spring Security实现禁止用户重复登陆的配置原理
  9. 根据rtk参数在arcgis中进行可视化
  10. 论文浅尝 - ICML2020 | 对比图神经网络解释器
  11. 利用Referer请求头防止“盗链”
  12. java split 路径,JAVA通过文件路径分隔符分割文件路径
  13. 斯坦福吴恩达团队公布最大医学影像数据集
  14. 设计模式分类以及六大设计原则(汇总篇)
  15. 【Tips】如何批量安装和导出Python项目的依赖库?
  16. Warning: You are calling ReactDOM.unmountComponentAtNode() on a container that was previously passed
  17. python概率编程_TensorFlow新功能:TensorFlow Probability概率编程工具箱介绍
  18. FL Studio教程之如何插入第三方插件
  19. torch.diag() 取矩阵对角线元素,torch.diag_embed() 指定值变成对角矩阵
  20. 二叉树的遍历(先序、中序、后序)

热门文章

  1. linux usb摄像头设备,Linux系统下USB摄像头驱动开发
  2. yocto系列讲解[技巧篇]72 - BBCLASSEXTEND变量的作用
  3. [转载]铁路订票系统的简单设计
  4. 如何利用python盗qq_一个团队为了让我帮他提高流量,竟然盗我QQ,没办法,我只好帮他用python刷了刷流量!...
  5. 遥感如何穿透云雨雾和黑夜,从太空看破地球?
  6. Android仿人人客户端(v5.7.1)——个人主页(二)
  7. 三十、动名词短语 2
  8. php阴历阳历互转类(1900~2100年)
  9. 工商银行历年考试真题 银行校园招聘考试笔试资料
  10. 【高等数学】第一章 函数与极限——第六节 极限存在准则 两个重要极限