一种桌面启动器动态添加浮动窗口方法
【技术领域】
[0001]本发明涉及数据处理领域,尤其是一种桌面启动器动态添加浮动窗口方法。
【背景技术】
[0002]往桌面启动器(Launcher)中添加部件,目前大部分是通过写AppWidget来实现的,Android系统最初面向的设备是低功耗的手持设备,必须考虑能耗和性能问题,在界面中添加多窗口和多任务处理势必加重设备负担,所以谷歌在设计AppWidget时对其性能及可使用性进行了极大的限制。因此通过这种方法编写的部件功能比较局限,不能进行复杂的数据处理,而且它所支持的布局控件有限,不支持自定义的控件。
[0003]在构造Widget布局时,AppWidget支持的布局和控件非常有限。除此之外的所有控件(包括自定义控件)都无法显示,无法显示时,添加出来的Widget会显示“加载布局出错”。如果想要支持比较复杂的视图,例如将导航地图也通过部件的形式添加到桌面启动器Launcher中,并且通过该部件实现导航等复杂操作,仅靠Android原生的AppWidget是无法实现的。
【发明内容】
[0004]为了解决上述技术问题,本发明的目的是:提供一种通过在添加简单widget的同时在桌面启动器动态添加浮动窗口从而实现复杂功能部件的方法。
[0005]本发明所采用的技术方案是:一种桌面启动器动态添加浮动窗口方法,包括有以下步骤:
A、当用户从列表中拖拽出widget时,桌面启动器提供当前生成的widget的参数进行初始化;
B、当用户将widget放置到桌面创建时,widget发送一个全局广播;
C、桌面启动器中的接收器接收到广播后确认生成浮动窗口;
D、桌面启动器启动时生成对应的浮动窗口,并处理浮动窗口触摸操作。
[0006]进一步,所述步骤A中当前生成的widget的参数包括有窗口位置、大小、状态以及展示内容。
[0007]进一步,所述浮动窗口的视图通过FloatService服务进行管理。
[0008]进一步,所述FloatService服务通过桌面启动器获得widget的移动位置并不断刷新浮动窗口的视图位置,从而实现浮动窗口与widget同步移动。
[0009]进一步,所述步骤D中桌面启动器生成对应的浮动窗口的具体步骤为:
Dl、在启动时对界面中的元素进行绑定;
D2、判断绑定的浮动窗口是否为对应的widget ;
D3、若为对应的wi dget,则开始读取保存的窗口信息。
[0010]进一步,所述步骤D中处理浮动窗口触摸操作的具体步骤为:
D4、获取并识别触屏操作数据; D5、判断触屏工作区是否在浮动窗口上面,若否则将触屏操作数据发送至桌面启动器处理,若是则由浮动窗口截取触摸操作数据;
D6、判断上述浮动窗口截取的触摸操作数据为点击或长按操作,若为长按则由桌面启动器处理,若为点击则由浮动窗口内部处理。
[0011]本发明的有益效果是:本发明方法通过widget桌面创建时同时设置浮动窗口,并利用FloatService服务实现浮动窗口与widget同步移动,以及浮动窗口与widget对触屏操作进行分别并同步处理,从而完成安卓系统原生的AppWidget无法实现的复杂操作。
【附图说明】
[0012]图1为本发明方法总步骤流程图;
图2为本发明方法实现的浮动窗口示意图;
图3为本发明方法步骤D的具体步骤流程图。
【具体实施方式】
[0013]下面结合附图对本发明的【具体实施方式】作进一步说明:
参照图1,一种桌面启动器动态添加浮动窗口方法,包括有以下步骤:
A、当用户从列表中拖拽出widget时,桌面启动器提供当前生成的widget的参数进行初始化;
B、当用户将widget放置到桌面创建时,widget发送一个全局广播;
C、桌面启动器中的接收器接收到广播后确认生成浮动窗口;
桌面启动器Launcher在已实现的接收器中接收广播,并在收到广播后设定标记,表示确认生成窗口。
[0014]D、桌面启动器启动时生成对应的浮动窗口,并处理浮动窗口触摸操作。
[0015]进一步作为优选的实施方式,所述步骤A中当前生成的widget的参数包括有窗口位置、大小、状态以及展示内容O
[0016]安卓系统中,WindowManager生成的窗口是系统层级的展示窗口,但仍需为其提供上下文Context以获取相关资源。WindowManager生成窗口需要提供两个参数:LayoutParams、View,前者为设置窗口位置、大小、状态,后者为展示内容。因此在生成浮动窗口时需要先初始化以上两个参数。
[0017]初始化过程参照下面代码段,首先调用WindowManager,并设置WindowManager.LayoutParams的相关属性,然后对展示内容进行初始化,其方法封装在FloatWindowsView类中:
/林
*根据标签对LayoutParams进行初始化氺 Oparam Tag */
public void createParames(int Tag){ wmParams = new LayoutParams ();
Il 设置 window typewmParams.type = LayoutParams.TYPE—PHONE;
Il设置图片格式,效果为背景透明wmParams.format = PixelFormat.RGBA_8888;
Il设置浮动窗口不可聚焦(实现操作除浮动窗口外的其他可见窗口的操作)wmParams.flags =
LayoutParams.FLAG—NOT—FOCUSABLE
j
Il调整悬浮窗显示的停靠位置
wmParams.gravity = Gravity.LEFT | Gravity.TOP; wmParams.x = posiAWHs[Tag].x; wmParams.y = posiAWHs[Tag].y;
Il设置悬浮窗口长宽数据
wmParams.width = posiAWHs[Tag].width;
wmParams.height = posiAWHs[Tag].height;
}
/林
*应展示视图View的初始化 */
public void createFloatView(final int mFloatTitleld, final intmFloatffindowId)
{
LayoutInflater inflater = LayoutInflater, from(context);
Il获取浮动窗口视图所在布局mFloatLayout = (LinearLayout) inflater, inflate(R.layout.myfloat_layout, null);
Il 添加 mFloatLayout wmParams.flags =
LayoutParams.FLAG_NOT_FOCUSABLE
LayoutParams.FLAG_LAYOUT_NO_LIMITS;wmParams.windowAnimat1ns = R.anim.0penanim;
//为WindowManager提供内容并生成窗口
mffindowManager.addView(mFloatLayout, wmParams);
}
进一步作为优选的实施方式,所述浮动窗口的视图通过FloatService服务进行管理。
[0018]进一步作为优选的实施方式,所述FloatService服务通过桌面启动器获得widget的移动位置并不断刷新浮动窗口的视图位置,从而实现浮动窗口与widget同步移动。
[0019]参照图2,所述FloatService服务在桌面启动器Launcher运行时始终存在,可实现对浮动窗口 I的生成、替换和切换功能,并利用上述功能实现浮动窗口 I的移动,即利用桌面启动器获得AppWidget 2的移动位置,并利用FloatService服务将浮动窗口 I的位置实时更新,具体实现方法如下:
首先,CellLayout中有getViewsIntersectingReg1n函数,将在图标icon移动时频繁刷新,同时其参数中ArrayList〈View> intersectingViews中,包含的是被覆盖的icon,在地图widget被覆盖要求