腾讯手机管家快捷中心功能分析

腾讯手机管家快捷中心功能分析

今天在使用腾讯手机管家的时候,发现一个有意思的功能,就是可以从任何应用界面的底部向上滑动,弹出腾讯管家的快捷功能菜单。效果如图1所示:

图1

此类功能,最初是在IPhone上的功能,曾经考虑过在Android上如何实现。经过分析,发现可以在framework 的PhoneWindow.java中的Touch事件中处理从底部向上滑动的消息,然后弹出系统的菜单。

腾讯手机管家,是如何在不修改framework的情况下实现这个功能的呢?

我们来查看一下图1 的时候,,各个window的情况,使用adb shell dumpsys window>window.log

Window #14 Window{b325b1c8 u0 com.tencent.qqpimsecure}:

……

mOwnerUid=10053 mShowToOwnerOnly=true package=com.tencent.qqpimsecure appop=SYSTEM_ALERT_WINDOW

……

Surface: shown=true layer=221005 alpha=1.0 rect=(0.0,38.0) 480.0 x 816.0

Window #13 Window{b3115540 u0 com.tencent.qqpimsecure}:

……

mOwnerUid=10053 mShowToOwnerOnly=true package=com.tencent.qqpimsecure appop=SYSTEM_ALERT_WINDOW

……

Surface: shown=true layer=221000 alpha=1.0 rect=(0.0,0.0) 480.0 x 854.0

图2

此时拿出关键的log,去掉了一些无用的log。如图2所示

Window #14 Window #13都是SYSTEM_ALERT_WINDOW类型的Window,由于Z-Order比较高所以会显示到所有的Activity的上层,却在锁屏界面的下层。

在来看一下这两个窗口的大小:

Window#14窗口的尺寸由蓝色字符串说明:

rect=(0.0,38.0) 480.0 x 816.0

左上角坐标是(0,38),宽度x高度=480px * 816px

同理Window#13是一个左上角坐标(0,0), 宽度x高度=480px * 854px,也就是全屏的一个悬浮窗口。该窗口位于window#14之下。

那么该窗口究竟是怎么弹出的呢?从底部向上滑动的手势又是如何被捕获,然后响应,弹出快捷菜单呢?

图3

我们回到桌面,此时的window层数是最少的,更加好分析一些。

通过adb shell dumpsys window >window2.log,抓取此时的各个window的信息,关键信息如下:

Window #9 Window{b315f7f8 u0 com.tencent.qqpimsecure}:

……

mOwnerUid=10053 mShowToOwnerOnly=true package=com.tencent.qqpimsecure appop=SYSTEM_ALERT_WINDOW

……

Surface: shown=true layer=91005 alpha=1.0 rect=(424.0,208.0) 56.0 x 56.0

Window #8 Window{b30573a8 u0 com.tencent.qqpimsecure}:

……

mOwnerUid=10053 mShowToOwnerOnly=true package=com.tencent.qqpimsecure appop=SYSTEM_ALERT_WINDOW

……

Surface: shown=true layer=91000 alpha=1.0 rect=(0.0,833.0) 480.0 x 21.0

在图3所示的界面,Window#9,Window#8是两个比较特别的窗口,由shown的值为true表明,这两个窗口是显示在手机屏幕上的,由appop的值可以知道,这两个窗口的类型为SYSTEM_ALERT_WINDOW,可以显示到任意Activity窗口的上方,下面再来看两个窗口的尺寸Window#9的尺寸为位于(424, 208)的56px*56px的大小,一看就是那个圆形的电量提示悬浮窗口。Window#8的尺寸为,位于(0,833),的480px*21px的一个矩形区域,手机屏幕的实际尺寸为480×854,所以很容易计算出,该矩形区域正好为与手机屏幕的底部,高度为21px。

通过到目前的为止的分析已经可以确定,捕捉从屏幕底部向上滑动的事件的,正是Window#8窗口中的View(悬浮窗口),然后根据事件,做出相应的响应。例如弹出快捷窗口。

通过进一步仔细查看该功能发现,其实在设置该功能的时候,已经提示了该功能的实现,如下图所示:

图4

综上:该功能实现还是使用悬浮窗口,只不过这些悬浮窗口的尺寸和可见性比较巧妙,如果不注意,还不能推测出该功能是如何实现的。当然,仅仅推测出原理还不够,还需要进一步去实践,可能会在实际测试过程中遇到各种问题。毕竟悬浮窗口会阻挡一些事件,一些的功能点的取舍权衡非常重要。从图4中的三个蓝色的矩形条,就可以看出,这三个矩形条的宽度和高度也都是精挑细选的。我们总以为理所当然的东西,往往都凝聚着开发者的汗水、用心和创意。

父母养我不容易,我在学校争口气。

腾讯手机管家快捷中心功能分析

相关文章:

你感兴趣的文章:

标签云: