今天刚更新了来电通1.3.0.1Android版本,发现新增添了一个悬浮窗显示流量功能,很是牛X。于是好奇想知道怎么实现的,网上一搜索,原来是重写了Toast窗体的样式,然后在程序中一直调用显示该Toast就可以了。可是,如何实现Toast任意移动呢?之前的图片移动思路都是建立在本程序窗口内,这个Toast可是任意窗口之上的啊…
真牛X,有空试一下代码,看怎么弄的….
————更新—————-
被误导了!Toast根本就不接受焦点,浪费我半天时间,给Toast自定义了一个view,即使定义view为焦点可控,也没有任何作用! 看了SDK的Activity文档,发现以下内容:
“An activity is a single, focused thing that the user can do. Almost all activities interact with the user, so the Activity class takes care of creating a window for you in which you can place your UI with setContentView(View). While activities are often presented to the user as full-screen windows, they can also be used in other ways: as floating windows (via a theme with windowIsFloating set) or embedded inside of another activity (using ActivityGroup).”
可是如果通过activity来实现貌似是不可能的,因为悬浮窗体作为程序的一个属性,可以随时关闭。
好吧,我已经没有思路了,脑细胞也已经死差不多了,睡觉去了!
———————-2011.1.23–1:30更新—————-
我现在只想说“发克”,一天半的时间全花在这上面了,反编译了三个带悬浮窗功能的软件,看代码看到现在!没有思路的原因就是陷入了惯性思维,被限制在Activity里面了。这个很牛X的悬浮窗原来就是直接使用WindowManager添加了一个View。
这个WindowManager是最底层的,且是全局唯一的,通过使用WindowManager mWin = (WindowManager)getSystemService(Context.WINDOW_SERVICE)来获得,实际上Activity啊Dialog啊Toast啊等等都是基于WindowManager来实现的。用它生成的东西在直接“画在”屏幕上,不用管什么activity或是当前什么应用程序。
哎,累~WindowManager的属性和使用方法需要进一步查询资料了,悬浮窗口的思路就是这样,剩下来的就是封装、重写代码设计而已了。
———————-2011.1.24–11:18更新—————-
应经成功搞定,参见这里。
发表回复