技术领域
[0001] 本
发明涉及
数据处理领域,尤其是一种桌面启动器动态添加浮动窗口方法。
背景技术
[0002] 往桌面启动器(Launcher)中添加部件,目前大部分是通过写AppWidget来实现的,Android系统最初面向的设备是低功耗的
手持设备,必须考虑能耗和性能问题,在界面中添加
多窗口和多任务处理势必加重设备负担,所以谷歌在设计AppWidget时对其性能及可使用性进行了极大的限制。因此通过这种方法编写的部件功能比较局限,不能进行复杂的数据处理,而且它所支持的布局控件有限,不支持自定义的控件。
[0003] 在构造Widget布局时,AppWidget支持的布局和控件非常有限。除此之外的所有控件(包括自定义控件)都无法显示,无法显示时,添加出来的Widget会显示“加载布局出错”。如果想要支持比较复杂的视图,例如将导航地图也通过部件的形式添加到桌面启动器Launcher中,并且通过该部件实现导航等复杂操作,仅靠Android原生的AppWidget是无法实现的。
发明内容
[0004] 为了解决上述技术问题,本发明的目的是:提供一种通过在添加简单widget的同时在桌面启动器动态添加浮动窗口从而实现复杂功能部件的方法。
[0005] 本发明所采用的技术方案是:一种桌面启动器动态添加浮动窗口方法,包括有以下步骤:
[0006] A、当用户从列表中拖拽出widget时,桌面启动器提供当前生成的widget的参数进行初始化 ;
[0007] B、当用户将widget放置到桌面创建时,widget发送一个全局广播;
[0008] C、桌面启动器中的接收器接收到广播后确认生成浮动窗口;
[0009] D、桌面启动器启动时生成对应的浮动窗口,并处理浮动窗口触摸操作。
[0010] 进一步,所述步骤A中当前生成的widget的参数包括有窗口
位置、大小、状态以及展示内容。
[0011] 进一步,所述浮动窗口的视图通过FloatService服务进行管理。
[0012] 进一步,所述FloatService服务通过桌面启动器获得widget的移动位置并不断刷新浮动窗口的视图位置,从而实现浮动窗口与widget同步移动。
[0013] 进一步,所述步骤D中桌面启动器生成对应的浮动窗口的具体步骤为:
[0014] D1、在启动时对界面中的元素进行绑定;
[0015] D2、判断绑定的浮动窗口是否为对应的widget;
[0016] D3、若为对应的widget,则开始读取保存的窗口信息。
[0017] 进一步,所述步骤D中处理浮动窗口触摸操作的具体步骤为:
[0018] D4、获取并识别触屏操作数据;
[0019] D5、判断触屏工作区是否在浮动窗口上面,若否则将触屏操作数据发送至桌面启动器处理,若是则由浮动窗口截取触摸操作数据;
[0020] D6、判断上述浮动窗口截取的触摸操作数据为点击或长按操作,若为长按则由桌面启动器处理,若为点击则由浮动窗口内部处理。
[0021] 本发明的有益效果是:本发明方法通过widget桌面创建时同时设置浮动窗口,并利用FloatService服务实现浮动窗口与widget同步移动,以及浮动窗口与widget对触屏操作进行分别并同步处理,从而完成安卓系统原生的AppWidget无法实现的复杂操作。
附图说明
[0023] 图2为本发明方法实现的浮动窗口示意图;
[0024] 图3为本发明方法步骤D的具体步骤流程图。
具体实施方式
[0025] 下面结合附图对本发明的具体实施方式作进一步说明:
[0026] 参照图1,一种桌面启动器动态添加浮动窗口方法,包括有以下步骤:
[0027] A、当用户从列表中拖拽出widget时,桌面启动器提供当前生成的widget的参数进行初始化 ;
[0028] B、当用户将widget放置到桌面创建时,widget发送一个全局广播;
[0029] C、桌面启动器中的接收器接收到广播后确认生成浮动窗口;
[0030] 桌面启动器Launcher在已实现的接收器中接收广播,并在收到广播后设定标记,表示确认生成窗口。
[0031] D、桌面启动器启动时生成对应的浮动窗口,并处理浮动窗口触摸操作。
[0032] 进一步作为优选的实施方式,所述步骤A中当前生成的widget的参数包括有窗口位置、大小、状态以及展示内容。
[0033] 安卓系统中,WindowManager生成的窗口是系统层级的展示窗口,但仍需为其提供上下文Context以获取相关资源。WindowManager生成窗口需要提供两个参数:LayoutParams、View,前者为设置窗口位置、大小、状态,后者为展示内容。因此在生成浮动窗口时需要先初始化以上两个参数。
[0034] 初始化过程参照下面代码段,首先调用WindowManager,并设置WindowManager.LayoutParams的相关属性,然后对展示内容进行初始化,其方法封装在FloatWindowsView类中:
[0035] /**
[0036] * 根据标签对LayoutParams进行初始化
[0037] * @param Tag
[0038] */
[0039] public void createParames(int Tag){
[0040] wmParams = new LayoutParams();
[0041] //设置window type
[0042] wmParams.type = LayoutParams.TYPE_PHONE;
[0043] //设置图片格式,效果为背景透明
[0044] wmParams.format = PixelFormat.RGBA_8888;
[0045] //设置浮动窗口不可聚焦(实现操作除浮动窗口外的其他可见窗口的操作)
[0046] wmParams.flags =
[0047] LayoutParams.FLAG_NOT_FOCUSABLE
[0048] ;
[0049] //调整悬浮窗显示的停靠位置
[0050] wmParams.gravity = Gravity.LEFT | Gravity.TOP;
[0051] wmParams.x = posiAWHs[Tag].x;
[0052] wmParams.y = posiAWHs[Tag].y;
[0053] // 设置悬浮窗口长宽数据
[0054] wmParams.width = posiAWHs[Tag].width;
[0055] wmParams.height = posiAWHs[Tag].height;
[0056] }
[0057] /**
[0058] * 应展示视图View的初始化
[0059] */
[0060] public void createFloatView(final int mFloatTitleId,final int mFloatWindowId)
[0061] {
[0062] LayoutInflater inflater = LayoutInflater.from(context);
[0063] //获取浮动窗口视图所在布局
[0064] mFloatLayout = (LinearLayout) inflater.inflate(R.layout.myfloat_layout, null);
[0065] //添加mFloatLayout
[0066] wmParams.flags =
[0067] LayoutParams.FLAG_NOT_FOCUSABLE |
[0068] LayoutParams.FLAG_LAYOUT_NO_LIMITS;
[0069] wmParams.windowAnimations = R.anim.openanim;
[0070] //为WindowManager提供内容并生成窗口
[0071] mWindowManager.addView(mFloatLayout, wmParams);
[0072] }
[0073] 进一步作为优选的实施方式,所述浮动窗口的视图通过FloatService服务进行管理。
[0074] 进一步作为优选的实施方式,所述FloatService服务通过桌面启动器获得widget的移动位置并不断刷新浮动窗口的视图位置,从而实现浮动窗口与widget同步移动。
[0075] 参照图2,所述FloatService服务在桌面启动器Launcher运行时始终存在,可实现对浮动窗口1的生成、替换和切换功能,并利用上述功能实现浮动窗口1的移动,即利用桌面启动器获得AppWidget 2的移动位置,并利用FloatService服务将浮动窗口1的位置实时更新,具体实现方法如下:
[0076] 首先,CellLayout中有getViewsIntersectingRegion函数,将在图标icon移动时频繁刷新,同时其参数中ArrayList
intersectingViews中,包含的是被覆盖的icon,在地图widget被覆盖要求拖动时,将会被加入到这个数集中;[0077] 然后在CellLayout构建一个
接口用于传递widgetView的移动情况OnAppWidgetHostViewPosiChangeListener,并交由桌面启动器Launcher具体实现。当CellLayout中有AppWidget被动移动时,同时也需要确认所需的AppWidget的活动状况,具体实现可参照以下代码段:
[0078] if(intersectingViews.size()>=1){
[0079] for (View view:intersectingViews) {
[0080] if(view instanceof LauncherAppWidgetHostView) { if(((LauncherAppWidgetHostView)view).getAppWidgetInfo().provider.toString().e q ua l s (" Co m po n en t In f o {c om .li n .f l oa t ma p te s t /com.lin.floatmaptest.ExampleAppWidgetProvider}"))
[0081] {
[0082] if(appWidgetHostViewPosiChangeListener!=null)[0083] appWidgetHostViewPosiChangeListener.moving(view.getX(), view.getY());
[0084] }
[0085] }
[0086] }
[0087] }
[0088] 最后通过appWidgetHostViewPosiChangeListener这个接口将正确的AppWidget的活动情况反馈给FloatService服务,而FloatService服务的setPosition(float x,float y)方法将控制浮动窗口的位置,在不断刷新位置的情况下产生浮动窗口的移动效果。实现方式可参照以下两段代码段:
[0089] ①savecellview.setOnAppWidgetHostViewPosiChangeListener(this);
[0090] ② @Override
[0091] public void moving(float x, float y) {
[0092] floatService.setPosition(x,y);
[0093] }
[0094] 参照图3,进一步作为优选的实施方式,所述步骤D中桌面启动器生成对应的浮动窗口的具体步骤为:
[0095] D1、在启动时对界面中的元素进行绑定;
[0096] 桌面启动器Launcher启动时会对界面中的icon、AppWidget等元素进行绑定。
[0097] D2、判断绑定的浮动窗口是否为对应的widget,参照以下代码:
[0098] appWidgetInfo.provider.toString().equals("ComponentInfo{com.lin.floatmaptest/com.lin.floatmaptest.ExampleAppWidgetProvider}")[0099] D3、若为对应的widget,则开始读取SharePreference保存的窗口信息;
[0100] 上述SharePreference保存的信息在窗口初次生成时已经保存;根据存储的x,y,id等信息即完成浮动窗口的生成;具体可参照以下代码段:
[0101] Savecellview = (CellLayout) mWorkspace.getChildAt(2);
[0102] savecellview.setOnAppWidgetHostViewPosiChangeListener(this);
[0103] mSharedPreferences = getSharedPreferences("myown",Context.MODE_PRIVATE);
[0104] int id = mSharedPreferences.getInt("id",1000);
[0105] int x = mSharedPreferences.getInt("posix",10);
[0106] int y = mSharedPreferences.getInt("posiy",10);
[0107] 参照图3,进一步作为优选的实施方式,所述步骤D中处理浮动窗口触摸操作的具体步骤为:
[0108] D4、获取并识别触屏操作数据;
[0109] D5、判断触屏工作区是否在浮动窗口上面,若否则将触屏操作数据发送至桌面启动器处理,若是则由浮动窗口截取触摸操作数据;
[0110] D6、判断上述浮动窗口截取的触摸操作数据为点击或长按操作,若为长按则由桌面启动器处理,若为点击则由浮动窗口内部处理。
[0111] 参照上述处理步骤,本发明方法中先由浮动窗口处理触屏操作数据,并分享至桌面启动器Launcher;即通过ViewGroup中的dispatchTouchEvent(MotionEvent ev)获取浮动窗口的触摸事件MotionEvent,对数据不作截断,使浮动窗口处理完整的数据;同时将数据通过接口传递至桌面启动器Launcher,从而完成数据分享;然后又桌面启动器和浮动窗口内的AppWidget分别根据触屏操作数据完成自身的响应处理。上述步骤的实现通过重写自定义组件ViewGroup完成,由于浮动窗口和桌面启动器Launcher的触屏操作数据共享,不仅能实现浮动窗口中图标的移动、启动等操作,同时还能实现浮动窗口中应用程序内部数据的处理,例如在浮动窗口中的地图导航操作。
[0112] 以上是对本发明的较佳实施进行了具体说明,但本发明创造并不限于所述
实施例,熟悉本领域的技术人员在不违背本发明精神的前提下还可以作出种种的等同变换或替换,这些等同的
变形或替换均包含在本
申请权利要求所限定的范围内。