一种Linux平台上安卓应用的输入方法转让专利

申请号 : CN202210401564.0

文献号 : CN114489920B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 温研

申请人 : 北京麟卓信息科技有限公司

摘要 :

本发明公开了一种Linux平台上安卓应用的输入方法,通过在应用视图的构造过程中判断应用视图本身是否为编辑框控件,在应用视图绘制过程中判断应用视图是否动态创建了编辑框类的成员变量,实现了对安卓系统默认编辑框和用户自建编辑框的识别,在此基础上,在应用视图获得焦点时采用其内部不绘制文本内容的方式进行绘制,由此有效提高了Linux系统中安卓应用输入方法的适用范围。

权利要求 :

1.一种Linux平台上安卓应用的输入方法,其特征在于,具体包括以下步骤:

在安卓兼容环境中当应用视图创建时,依次在应用视图的构建及绘制过程中判断应用视图是否为编辑框控件,如果是则向安卓应用显示单元发送应用视图注册消息,并将应用视图的特征信息保存至应用视图列表,如果不是则不处理应用视图;当应用视图获得焦点时,若应用视图存在于应用视图列表中则使应用视图在刷新绘制时不绘制文本内容,并向安卓应用显示单元发送代理编辑框创建消息,如果不存在则不处理应用视图;当应用视图失去焦点时,若应用视图存在于应用视图列表中则向安卓应用显示单元发送代理编辑框销毁消息,如果不存在则不处理应用视图;

所述应用视图注册消息为包含应用视图的所属类名、View_ID、Activity_ID及PackageName的消息;所述代理编辑框创建消息为包含应用视图的View_ID、Activity_ID、焦点使能、View左上角坐标、View尺寸、当前显示内容、光标位置、编辑框特征成员函数及View属性,所述编辑框特征成员函数是指安卓系统中编辑框控件必须具有的函数;所述代理编辑框销毁消息包含应用视图的View_ID、Activity_ID及失去焦点;

安卓应用显示单元接收到所述应用视图注册消息时,将其中的信息作为一条记录增加到编辑框队列中;当接收到所述代理编辑框创建消息时,根据其中的信息修改所述编辑框队列中对应的条目,创建自绘制的代理编辑框,若所述条目中的所属类名为安卓系统编辑框类或编辑框特征成员函数不为空,则代理编辑框将获取的用户输入同步传递至安卓应用兼容服务绘制在应用视图中,否则不做处理;当接收到所述代理编辑框销毁消息时,根据其中的信息修改编辑框队列中对应的信息,将代理编辑框中的文本传递至安卓应用兼容服务绘制在应用视图中,销毁代理编辑框。

2.根据权利要求1所述的输入方法,其特征在于,所述使应用视图在刷新绘制时不绘制文本内容的方式,当应用视图为用户自建的应用视图时,包括以下步骤:安卓应用兼容服务采用当前Canvas对象的drawText函数,确定应用视图内文本的坐标位置与应用视图的坐标位置间的关系,将位于应用视图内的文本作为内部文本,禁止将所述内部文本渲染到应用视图中,并将所述内部文本与drawText函数中的Paint对象合并到代理编辑框创建消息中。

3.根据权利要求2所述的输入方法,其特征在于,所述当接收到所述代理编辑框创建消息时,根据其中的信息修改所述编辑框队列中对应的条目,创建自绘制的代理编辑框的过程中,当应用视图为用户自建的应用视图时,创建自绘制的代理编辑框的方式为:创建自绘制的代理编辑框,并根据获得的Paint对象中的属性采用Skia库绘制代理编辑框。

4.根据权利要求1或3所述的输入方法,其特征在于,所述代理编辑框设置背景全透明仅显示文本。

5.根据权利要求1所述的输入方法,其特征在于,所述依次在应用视图的构建及绘制过程中判断应用视图是否为编辑框控件,包括以下步骤:步骤5.1、在应用视图构建时,若应用视图继承自安卓系统编辑框类,则确定应用视图为编辑框控件,结束本流程;否则执行步骤5.2;

步骤5.2、若应用视图的成员标志字段中设置了焦点可用,则执行步骤5.3;否则确定应用视图不是编辑框控件,结束本流程;

步骤5.3、若应用视图的成员函数中包含编辑框特征成员函数,则应用视图为编辑框控件,结束本流程;否则执行步骤5.4;

步骤5.4、若应用视图的成员变量中存在继承自安卓系统编辑框类的成员变量,且成员变量的界面面积大于面积阈值,则应用视图为编辑框控件,结束本流程;否则执行步骤5.5;

步骤5.5、若应用视图的成员变量中存在继承自安卓系统视图类、满足任一判断条件的成员变量,且成员变量对应视图的界面面积大于或等于面积阈值,则应用视图为编辑框控件,结束本流程;否则执行步骤5.6;所述判断条件包括:成员标志字段中的焦点使能位设置为了焦点可用及成员函数中包含编辑框特征成员函数;

步骤5.6、在应用视图绘制时,若应用视图动态创建了编辑框控件,且编辑框控件的界面面积大于或等于面积阈值,则应用视图为编辑框控件,否则应用视图不是编辑框控件。

6.根据权利要求5所述的输入方法,其特征在于,所述面积阈值设置为应用视图的界面面积的三分之二。

说明书 :

一种Linux平台上安卓应用的输入方法

技术领域

[0001] 本发明属于在桌面操作系统上运行移动应用的开发技术领域,具体涉及一种Linux平台上安卓应用的输入方法。

背景技术

[0002] Linux系统安卓兼容环境(下文简称安卓兼容环境)是一种在Linux系统上运行安卓应用(App)的技术,对丰富Linux系统应用生态有着重要的意义。目前典型的安卓兼容环境主要包括安卓应用显示单元和安卓应用兼容服务,安卓应用显示单元用于在Linux系统上实现安卓应用的用户界面,安卓应用兼容服务用于提供运行于Linux系统上的安卓兼容环境,通过安卓应用显示单元与安卓应用兼容服务的相互配合实现安卓应用在Linux系统上的有效运行,例如,现有安卓兼容环境的实现xDroid,它包括xDroidUI和xDroidServer,xDroidUI为安卓应用显示单元,xDroidServer为安卓应用兼容服务。
[0003] Skia为开源的二维渲染引擎,包含字型、坐标转换及点阵图等函数库,现有安卓系统采用Skia库进行绘图处理,例如,安卓系统采用Skia库的canvas.drawText()函数来绘制文字。用户在使用安卓应用时,一般都会有输入内容的需求,典型的应用场景如:在用户使用WPS Office App时需要在WPS Office App的窗口中编辑文件输入内容,此时,用户输入的文字则是由canvas.drawText()函数绘制呈现在应用窗口中的。
[0004] 当用户在安卓兼容环境使用安卓应用时,同样有输入内容的需求,现有安卓兼容环境中往往通过安卓应用显示单元调用标准的Linux库完成安卓应用界面的创建,用户在创建的Linux界面中完成输入后再将数据传输至安卓应用兼容服务中,更进一步地通过在Linux系统创建代理编辑框的方式提高安卓应用界面同步的效率,然而现有的创建代理编辑框的方法仅能识别安卓系统标准的编辑框类,却无法识别由用户自建的应用视图,实际中用户自建的应用视图占比较高,由此会导致现有改进方法在使用时有比较明显的局限性。

发明内容

[0005] 有鉴于此,本发明提供了一种Linux平台上安卓应用的输入方法,能够实现安卓兼容环境中安卓应用的有效输入。
[0006] 本发明提供的一种Linux平台上安卓应用的输入方法,具体包括以下步骤:
[0007] 在安卓兼容环境中当应用视图创建时,依次在应用视图的构建及绘制过程中判断应用视图是否为编辑框控件,如果是则向安卓应用显示单元发送应用视图注册消息,并将应用视图的特征信息保存至应用视图列表,如果不是则不处理应用视图;当应用视图获得焦点时,若应用视图存在于应用视图列表中则使应用视图在刷新绘制时不绘制文本内容,并向安卓应用显示单元发送代理编辑框创建消息,如果不存在则不处理应用视图;当应用视图失去焦点时,若应用视图存在于应用视图列表中则向安卓应用显示单元发送代理编辑框销毁消息,如果不存在则不处理应用视图;
[0008] 所述应用视图注册消息为包含应用视图的所属类名、View_ID、Activity_ID及PackageName的消息;所述代理编辑框创建消息为包含应用视图的View_ID、Activity_ID、焦点使能、View左上角坐标、View尺寸、当前显示内容、光标位置、编辑框特征成员函数及View属性,所述编辑框特征成员函数是指安卓系统中编辑框控件必须具有的函数;所述代理编辑框销毁消息包含应用视图的View_ID、Activity_ID及失去焦点;
[0009] 安卓应用显示单元接收到所述应用视图注册消息时,将其中的信息作为一条记录增加到编辑框队列中;当接收到所述代理编辑框创建消息时,根据其中的信息修改所述编辑框队列中对应的条目,创建自绘制的代理编辑框,若所述条目中的所属类名为安卓系统编辑框类或编辑框特征成员函数不为空,则代理编辑框将获取的用户输入同步传递至安卓应用兼容服务绘制在应用视图中,否则不做处理;当接收到所述代理编辑框销毁消息时,根据其中的信息修改编辑框队列中对应的信息,将代理编辑框中的文本传递至安卓应用兼容服务绘制在应用视图中,销毁代理编辑框。
[0010] 进一步地,所述使应用视图在刷新绘制时不绘制文本内容的方式,当应用视图为用户自建的应用视图时,包括以下步骤:
[0011] 安卓应用兼容服务采用当前Canvas对象的drawText函数,确定应用视图内文本的坐标位置与应用视图的坐标位置间的关系,将位于应用视图内的文本作为内部文本,禁止将所述内部文本渲染到应用视图中,并将所述内部文本与drawText函数中的Paint对象合并到代理编辑框创建消息中。
[0012] 进一步地,所述当接收到所述代理编辑框创建消息时,根据其中的信息修改所述编辑框队列中对应的条目,创建自绘制的代理编辑框的过程中,当应用视图为用户自建的应用视图时,创建自绘制的代理编辑框的方式为:创建自绘制的代理编辑框,并根据获得的Paint对象中的属性采用Skia库绘制代理编辑框。
[0013] 进一步地,所述代理编辑框设置背景全透明仅显示文本。
[0014] 进一步地,所述依次在应用视图的构建及绘制过程中判断应用视图是否为编辑框控件,包括以下步骤:
[0015] 步骤5.1、在应用视图构建时,若应用视图继承自安卓系统编辑框类,则确定应用视图为编辑框控件,结束本流程;否则执行步骤5.2;
[0016] 步骤5.2、若应用视图的成员标志字段中设置了焦点可用,则执行步骤5.3;否则确定应用视图不是编辑框控件,结束本流程;
[0017] 步骤5.3、若应用视图的成员函数中包含编辑框特征成员函数,则应用视图为编辑框控件,结束本流程;否则执行步骤5.4;
[0018] 步骤5.4、若应用视图的成员变量中存在继承自安卓系统编辑框类的成员变量,且成员变量的界面面积大于面积阈值,则应用视图为编辑框控件,结束本流程;否则执行步骤5.5;
[0019] 步骤5.5、若应用视图的成员变量中存在继承自安卓系统视图类、满足任一判断条件的成员变量,且成员变量对应视图的界面面积大于或等于面积阈值,则应用视图为编辑框控件,结束本流程;否则执行步骤5.6;所述判断条件包括:成员标志字段中的焦点使能位设置为了焦点可用及成员函数中包含编辑框特征成员函数;
[0020] 步骤5.6、在应用视图绘制时,若应用视图动态创建了编辑框控件,且编辑框控件的界面面积大于或等于面积阈值,则应用视图为编辑框控件,否则应用视图不是编辑框控件。
[0021] 进一步地,所述面积阈值设置为应用视图的界面面积的三分之二。
[0022] 有益效果:
[0023] 1、本发明通过在应用视图的构造过程中判断应用视图本身是否为编辑框控件,在应用视图绘制过程中判断应用视图是否动态创建了编辑框类的成员变量,实现了对安卓系统默认编辑框和用户自建编辑框的识别,在此基础上,在应用视图获得焦点时采用其内部不绘制文本内容的方式进行绘制,由此有效提高了Linux系统中安卓应用输入方法的适用范围。
[0024] 2、本发明针对用户自建的编辑框类的应用视图,采用根据应用视图中文本与应用视图间的位置关系决定文本的显示的方式,有效避免了可能产生的控制失效的问题,从而提高了本发明的可用性和可靠性。
[0025] 3、本发明针对用户自建的编辑框类的应用视图,获取应用视图本身的绘制信息,在Linux系统中基于Skia库采用上述绘制信息直接绘制代理编辑框,在进一步减少安卓应用显示单元与安卓应用兼容服务之间的数据通信的同时,有效保持了代理编辑框与应用视图的一致性,提高了代理编辑框与应用视图之间的数据同步性。
[0026] 4、本发明通过将代理编辑框设置为背景透明仅显示文字的显示方式,能够有效减少安卓应用显示界面发生变化时代理编辑框的调整内容,从而进一步提高代理编辑框与安卓应用窗口的同步性。

附图说明

[0027] 图1为本发明提供的一种Linux平台上安卓应用的输入方法的流程图。

具体实施方式

[0028] 下面结合附图并举实施例,对本发明进行详细描述。
[0029] 本发明提供的一种Linux平台上安卓应用的输入方法,其基本思想是:通过在应用视图的构造过程中判断应用视图本身是否为编辑框控件,在应用视图绘制过程中判断应用视图是否动态创建了编辑框类的成员变量,根据上述过程判断应用视图是否为编辑框控件,对于编辑框类的应用视图,在其获得焦点时使其内部不绘制文本内容,并通知安卓应用显示单元创建代理编辑框获取用户输入。
[0030] 本发明提供的一种Linux平台上安卓应用的输入方法,流程如图1所示,包括以下步骤:
[0031] 一方面,在安卓兼容环境中,安卓应用兼容服务进行以下处理:
[0032] 当应用视图创建时,依次在应用视图的构建及绘制过程中判断应用视图是否为编辑框控件,如果应用视图为编辑框控件,则向安卓应用显示单元发送应用视图注册消息,并将应用视图的特征信息保存至应用视图列表中;否则,安卓应用兼容服务不对应用视图进行处理。当应用视图获得焦点时,判断应用视图是否存在于应用视图列表中,如果存在,则使应用视图在刷新绘制时不绘制文本内容,并向安卓应用显示单元发送代理编辑框创建消息;如果不存在,安卓应用兼容服务不对应用视图进行处理。当应用视图失去焦点时,判断应用视图是否存在于应用视图列表中,如果存在,则向安卓应用显示单元发送代理编辑框销毁消息;如果不存在,安卓应用兼容服务不对应用视图进行处理。
[0033] 本发明中,编辑框控件是指用于编辑文本的控件,包括继承自EditText的控件和用户自定义的控件。
[0034] 其中,应用视图注册消息,是指包含当前安卓兼容环境中新建的应用视图的特征信息的消息。特征信息包括应用视图所属类名、View_ID、Activity_ID及PackageName。其中,所属类名为应用视图所继承的类的名称,包括安卓系统的标准编辑框类,如EditText、AutoCompleteTextView等。
[0035] 代理编辑框创建消息,是指包含当前安卓兼容环境中获得焦点的应用视图的焦点标识信息的消息。焦点标识信息包括View_ID、Activity_ID、焦点使能、View左上角坐标、View尺寸、当前显示内容、光标位置、编辑框特征成员函数及View属性。其中,编辑框特征成员函数是指安卓系统中编辑框控件必须具有的函数,包括textChangedListener、beforeTextChanged、onTextChanged、afterTextChanged等函数;View属性是指包含输入类型inputType、提示文字hint、字体textStyle及字体大小textSize等在内的View通用属性。
[0036] 代理编辑框销毁消息,是指包含当前安卓兼容环境中失去焦点的应用视图的失去焦点标识信息的消息。失去焦点标识信息包括View_ID、Activity_ID及失去焦点。
[0037] 本发明中,判断应用视图是否为编辑框控件的过程,包括以下步骤:
[0038] 步骤1‑1、在应用视图构建时,判断应用视图是否为编辑框控件,如果是则结束本流程,否则执行步骤1‑2。本步骤的目的是判断应用视图本身是否为编辑框控件。
[0039] 具体来说,在应用视图构建时,判断应用视图是否为编辑框控件,包括如下步骤:
[0040] 步骤1‑1.1、判断应用视图是否继承自安卓系统编辑框类,如果是则应用视图为编辑框,结束本流程;如果不是,则执行步骤1‑1.2。
[0041] 步骤1‑1.2、判断应用视图的成员标志字段中是否设置了焦点使能,如果设置为焦点可用,则执行步骤1‑1.3;如果未设置为焦点可用,则应用视图不是编辑框控件,结束本流程。
[0042] 在安卓系统中,成员标志字段中是否设置了焦点使能,其中FOCUSABLE_MASK表示FOCUSABLE属性占用mViewFlags的bit位置,可以看出mViewFlags中第1位和第5位用来联合表示View的焦点模式,有FOCUSABLE、NOT_FOCUSABLE和FOCUSABLE_AUTO三种焦点模式,第1位控制FOCUSABLE、NOT_FOCUSABLE,第5位单独控制FOCUSABLE_AUTO。
[0043] 步骤1‑1.3、基于Java的反射机制,遍历应用视图的所有成员函数,如果成员函数中包含编辑框特征成员函数,则应用视图为编辑框控件,结束本流程;如果成员函数中没有编辑框特征成员函数,则执行步骤1‑1.4。
[0044] 步骤1‑1.4、遍历应用视图的成员变量,若其中存在继承自安卓系统编辑框类的成员变量,且该成员变量的界面面积大于或等于面积阈值,则应用视图为编辑框控件,结束本流程;否则执行步骤1‑1.5。
[0045] 步骤1‑1.5、若应用视图的成员变量中存在继承自安卓系统视图类的成员变量,若该成员变量满足任一判断条件且其对应视图的界面面积大于或等于面积阈值,则应用视图为编辑框控件,结束本流程;否则执行步骤1‑2。
[0046] 判断条件包括:1、成员变量的成员标志字段中的焦点使能位设置为了焦点可用;2、成员变量的成员函数中包含编辑框特征成员函数。
[0047] 步骤1‑2、在应用视图绘制时,判断应用视图是否动态创建了编辑框控件,如果动态创建了编辑框控件且编辑框控件的界面面积大于或等于面积阈值,则认为应用视图为编辑框控件,否则不是编辑框控件,返回判断结果,结束本流程。本步骤的目的是判断应用视图在绘制过程中是否动态创建了满足条件的编辑框类的成员变量。
[0048] 具体来说,在应用视图绘制时,判断应用视图是否为编辑框控件的过程为:模拟令应用视图获取焦点的操作,应用视图在获取焦点后动态创建了成员变量,若成员变量同时满足继承自安卓系统编辑框类及其界面面积大于或等于面积阈值两个条件,则应用视图为编辑框控件;否则,应用视图不是编辑框控件。
[0049] 通常情况下,面积阈值设置为应用视图的界面面积的三分之二。
[0050] 此外,在改变应用视图的绘制过程使应用视图在刷新绘制时不绘制文本内容的过程中,对于用户自建的应用视图采用现有方式使应用视图不绘制文本时,可能会出现控制失效的问题,因此,为了进一步提高本发明的可用性和可靠性,针对安卓应用开发者自定义的应用视图还可采用更优化的方式实现。
[0051] 现有技术中,安卓应用的开发者在开发安卓应用的过程中,往往需要重新实现安卓系统提供的视图的onDraw函数,同时调用安卓系统的Canvas对象,以实现自定义的应用视图。安卓系统中,Canvas可以被理解为安卓系统提供给安卓应用的对内存区域进行操作的方法,即Canvas的API。因此,为了能在不修改现有安卓应用的情况下改变安卓应用的应用视图的绘制过程,本发明可选择对安卓系统Canvas对象的drawText渲染文本函数进行修改,结构为drawText(String text, float x, float y, Paint paint),其中,text为String类型的文本、x为文本的x轴坐标,y为文本的y轴坐标、paint为将渲染的Paint对象。
[0052] 本发明采用修改安卓系统Canvas对象的drawText函数的方式,改变应用视图的绘制过程使应用视图在刷新绘制时不绘制文本内容,具体包括以下步骤:
[0053] 根据drawText函数中的文本的坐标位置与应用视图或成员变量的对应视图的位置的关系,判断文本与应用视图或成员变量的对应视图的位置关系,即文本是否全部都在应用视图或成员变量的对应视图内,还是部分在应用视图或成员变量的对应视图内;对于文本中位于应用视图或成员变量的对应视图内的部分内容,将其作为内部文本,停止将内部文本渲染到应用视图或成员变量的对应视图中,并将内部文本与drawText函数中的Paint对象合并到代理编辑框创建消息中,将代理编辑框创建消息传递至安卓应用显示单元;对于文本中位于应用视图或成员变量的对应视图之外的部分内容,则按照对应的坐标进行渲染。
[0054] 此时,代理编辑框创建消息包括焦点标识信息、内部文本及Paint对象,Paint对象包括字体名称、字体大小、字体颜色及字体效果等信息。
[0055] 另一方面,在Linux系统中,安卓应用显示单元进行以下处理:
[0056] 当安卓应用显示单元接收到应用视图注册消息时,解析应用视图注册消息,再将消息中的特征信息包括应用视图所属类名、View_ID、Activity_ID及PackageName作为一条记录增加到编辑框队列中。
[0057] 当安卓应用显示单元接收到代理编辑框创建消息时,解析代理编辑框创建消息,根据消息内容在编辑框队列中查找对应的信息,修改编辑框队列中的对应条目后,创建代理编辑框,代理编辑框为自绘制的编辑框;若对应条目中的所属类名属于标准编辑框类,或代理编辑框创建消息中的编辑框特征成员函数不为空,则代理编辑框获取的用户输入内容同步传递至安卓应用兼容服务,由安卓应用兼容服务显示到应用视图中;否则不处理。
[0058] 当安卓应用显示单元接收到代理编辑框销毁消息时,解析代理编辑框销毁消息,根据消息内容在编辑框队列中查找对应的信息,修改编辑框队列中的内容,将代理编辑框中的文本传递至安卓应用兼容服务,由安卓应用兼容服务显示到应用视图中,销毁代理编辑框。
[0059] 本发明提供的销毁代理编辑框的方式包括以下步骤:
[0060] 步骤2‑1、当安卓应用兼容服务接收到输入完成事件时,禁用安卓系统的vsync信号,通知安卓应用显示单元隐藏代理编辑框;
[0061] 步骤2‑2、安卓应用显示单元隐藏代理编辑框后,通知安卓应用兼容服务恢复vsync信号,安卓应用兼容服务恢复vsync信号后通知安卓应用显示单元销毁代理编辑框;
[0062] 步骤2‑3、安卓应用显示单元销毁代理编辑框,并将编辑框从编辑框队列中删除。
[0063] 为了进一步地提高代理编辑框的创建效率及代理编辑框视图绘制的字体一致性,以及代理编辑框与应用视图之间的数据同步性,当代理编辑框创建消息中包括内部文本及Paint对象时,本发明中Linux系统中的安卓应用显示单元采用与应用视图相同的创建方式进行绘制代理编辑框,即在Linux系统中采用Skia绘制代理编辑框。此时,安卓应用显示单元创建代理编辑框的过程为:
[0064] 当安卓应用显示单元接收到代理编辑框创建消息时,解析代理编辑框创建消息,根据消息内容在编辑框队列中查找对应的信息,修改编辑框队列中的对应条目后,根据获得的Paint对象中的属性采用Skia绘制代理编辑框,代理编辑框为自绘制的编辑框;若对应条目中的所属类名属于标准编辑框类,或代理编辑框创建消息中的编辑框特征成员函数不为空,则代理编辑框获取的用户输入内容同步传递至安卓应用兼容服务,由安卓应用兼容服务显示到应用视图中;否则不处理。
[0065] 为进一步提升代理编辑框与安卓应用窗口的同步性,本发明中代理编辑窗口仅显示文本不绘制任何背景,即将代理编辑框的背景设置为全透明。
[0066] 进一步地,由于代理编辑框中仅显示文本,因此,当安卓应用窗口移动时文本本身没有变化,因此仅需根据安卓应用窗口的位置计算代理编辑框的新位置,并在新位置进行显示;同理,当安卓应用窗口缩放时,安卓应用显示单元从安卓应用兼容服务获取当前的安卓应用窗口尺寸及字体大小,调整代理编辑框中的字体后进行显示。
[0067] 综上所述,以上仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。