一种电子设备的截屏方法及系统
技术领域
本发明涉及电子设备技术领域,特别涉及一种电子设备的截屏方法及系统。
背景技术
目前随着人们生活水平日益提高,电子设备几乎成了社交生活必备的产品,在生活中用户经常对电子设备的屏幕进行截屏,以保存当前的显示画面,方便快捷。
但是现有的截屏方法通常都是截取整个屏幕或者整个屏幕的某个连续区域,很多时候通过无法满足用户真正想要截取的内容,比如:当前屏幕上悬浮着一个view(视图)但是用户并不想截取这个view,仅仅只想截取它底层的部分,又或者用户想截图的是非连续的区域等等,目前的截屏方法还无法实现此类截屏需求
因而现有技术还有待改进和提高。
发明内容
鉴于上述现有技术的不足之处,本发明的目的在于提供一种电子设备的截屏方法及系统,通过对当前显示界面的解析重构,将所有视图都呈现在展示界面中,用户可以自由选择不希望截取的部分,最后生成所需的截图,使得截屏体验更加丰富,且更加贴合用户的多种需求,实现了自由截屏功能。
为了达到上述目的,本发明采取了以下技术方案:
一种电子设备的截屏方法,其包括如下步骤:
A、获取电子设备当前显示的界面信息并进行解析,得到指定窗口的所有视图控件信息;
B、解析所述视图控件信息,将指定窗口的所有视图控件组建成视图控件树,并构建包括与所有视图控件对应的图像视图的展示界面;
C、接收用户对所述图像视图的点击指令,将被用户点击的图像视图从展示界面移除,并在接收到保存指令时保存当前的展示界面;
D、截取当前屏幕的展示界面并保存。
所述的电子设备的截屏方法中,所述步骤A包括步骤:
A1、获取电子设备当前显示的界面信息,得到所有的窗口信息,并依次对各个窗口进行解析;
A2、根据获取指令获取指定窗口的所有视图控件信息。
所述的电子设备的截屏方法中,所述步骤B包括步骤:
B1、解析所述视图控件信息,将指定窗口的所有视图控件组建成视图控件树;
B2、将视图控件树中每个视图控件的信息传输至对应的视图节点,并转换为对应视图节点的节点属性;
B3、根据所述视图节点的节点属性构建展示界面,所述展示界面包括与所有视图控件对应的图像视图。
所述的电子设备的截屏方法中,所述步骤B3包括步骤:
B31、将每个视图控件单独绘制成图片并保存;
B32、根据所述节点属性中视图控件的位置信息,通过图像视图将对应的图片显示在相同位置形成展示界面。
所述的电子设备的截屏方法中,所述步骤C包括步骤:
C1、接收用户对展示界面上图像视图的点击指令;
C2、当一图像视图被点击时,设置该图像视图对应的视图节点的标签信息为已移除,将其从当前展示界面移除;
C3、接收用户输入的保存指令并保存当前的显示界面。
一种电子设备的截屏系统,其包括:
获取模块,用于获取电子设备当前显示的界面信息并进行解析,得到指定窗口的所有视图控件信息;
解析构建模块,用于解析所述视图控件信息,将指定窗口的所有视图控件组建成视图控件树,并构建包括与所有视图控件对应的图像视图的展示界面;
界面处理模块,用于接收用户对所述图像视图的点击指令,将被用户点击的图像视图从展示界面移除,并在接收到保存指令时保存当前的展示界面;
截屏模块,用于截取当前屏幕的展示界面并保存。
所述的电子设备的截屏系统中,所述获取模块包括:
第一获取单元,用于获取电子设备当前显示的界面信息,得到所有的窗口信息,并依次对各个窗口进行解析;
第二获取单元,用于根据获取指令获取指定窗口的所有视图控件信息。
所述的电子设备的截屏系统中,所述解析构建模块包括:
解析单元,用于解析所述视图控件信息,将指定窗口的所有视图控件组建成视图控件树;
信息处理单元,用于将视图控件树中每个视图控件的信息传输至对应的视图节点,并转换为对应视图节点的节点属性;
构建单元,用于根据所述视图节点的节点属性构建展示界面,所述展示界面包括与所有视图控件对应的图像视图。
所述的电子设备的截屏系统中,所述构建单元包括:
绘图子单元,用于将每个视图控件单独绘制成图片并保存;
显示单元,用于根据所述节点属性中视图控件的位置信息,通过图像视图将对应的图片显示在相同位置形成展示界面。
所述的电子设备的截屏系统中,所述界面处理模块包括:
指令接收单元,用于接收用户对展示界面上图像视图的点击指令;
标签设置单元,用于当一图像视图被点击时,设置该图像视图对应的视图节点的标签信息为已移除,将其从当前展示界面移除;
保存单元,用于接收用户输入的保存指令并保存当前的显示界面。
相较于现有技术,本发明提供的电子设备的截屏方法及系统中,所述电子设备的截屏方法通过获取电子设备当前显示的界面信息并进行解析,得到指定窗口的所有视图控件信息;之后解析所述视图控件信息,将指定窗口的所有视图控件组建成视图控件树,并构建包括与所有视图控件对应的图像视图的展示界面;之后接收用户对所述图像视图的点击指令,将被用户点击的图像视图从展示界面移除,并在接收到保存指令时保存当前的展示界面,之后截取当前屏幕的展示界面并保存。通过对当前显示界面的解析重构,将所有视图都呈现在展示界面中,用户可以自由选择不希望截取的部分,最后生成所需的截图,使得截屏体验更加丰富,且更加贴合用户的多种需求,实现了自由截屏功能。
附图说明
图1 为本发明提供的电子设备的截屏方法的流程图。
图2 为本发明提供的电子设备的截屏方法中电子设备界面组成示意图。
图3 为本发明提供的电子设备的截屏方法的实施例中电子设备显示的界面图。
图4 为本发明提供的电子设备的截屏方法的实施例中电子设备显示的界面图对应的视图抽象图。
图5 为本发明提供的电子设备的截屏系统的结构框图。
具体实施方式
鉴于现有技术中截屏方法单一等缺点,本发明的目的在于提供一种电子设备的截屏方法及系统,通过对当前显示界面的解析重构,将所有视图都呈现在展示界面中,用户可以自由选择不希望截取的部分,最后生成所需的截图,使得截屏体验更加丰富,且更加贴合用户的多种需求,实现了自由截屏功能。
为使本发明的目的、技术方案及效果更加清楚、明确,以下参照附图并举实施例对本发明进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。
请参阅图1,本发明提供的电子设备的截屏方法包括如下步骤:
S100、获取电子设备当前显示的界面信息并进行解析,得到指定窗口的所有视图控件信息;
S200、解析所述视图控件信息,将指定窗口的所有视图控件组建成视图控件树,并构建包括与所有视图控件对应的图像视图的展示界面;
S300、接收用户对所述图像视图的点击指令,将被用户点击的图像视图从展示界面移除,并在接收到保存指令时保存当前的展示界面;
S400、截取当前屏幕的展示界面并保存。
当用户触发了截屏动作后,例如用户按下了预设的截屏按键组合,则获取当前电子设备显示的界面信息并进行解析,得到用户想截屏的指定窗口的所有视图控件信息,之后解析所述视图控件信息,并将所有视图控件组建成视图控件树,构建展示界面,该展示界面包括与所有视图控件对应的图像视图,即以图片形式展示各个视图,之后接收用户对所述图像视图的点击指令,将被用户点击的图像视图从展示界面移除,当用户移除了所有不需要截取的图像视图时,点击保存按键,则保存当前的展示界面,优选地,被移除的视图会被保存在取出界面中,用户可以通过返回按键回复上一次移除的视图或者在取出界面中点击对应的视图进行恢复,避免用户的误操作,之后对当前屏幕的展示界面进行截图,截取当前屏幕的展示界面并保存,此时保存的屏幕截图则为用户需要的、没有其他干扰图像的截图,从而实现了截屏时用户对当前显示界面的自由调整,得到其最需要的屏幕截图,丰富了截屏体验,给用户带来了方便。
进一步地,所述步骤S100包括:
S101、获取电子设备当前显示的界面信息,得到所有的窗口信息,并依次对各个窗口进行解析;
S102、根据获取指令获取指定窗口的所有视图控件信息。
请一并参阅图2,电子设备显示的界面为一个窗口1(window),这个窗口1又包含了许多个视图(view)进行界面的展示,这些展示的view由一个顶层视图2控制和包裹(比如DecorView),界面中其他view通过并行或者父子关系的view组成,包括父视图3和子视图301,同时界面可能会有多个window,例如在一个界面经过操作弹出来一个popWindow,那么这个界面就有两个window,本发明通过在触发了截屏动作后,获取电子设备当前显示的界面信息,得到所有的窗口信息,并依次对各个窗口进行解析,根据用户输入的获取指令,获取其需要截取的指定窗口的所有视图控件信息。
具体实施时,通过系统调试工具(HierarchyViewer)的实现思路,在电子设备上可以通过发送shell命令获取到电子设备的界面信息,例如:发送”LIST”命令,就可以获得界面所有Window的信息,该信息中会包含Window Id等信息;发送”DUMP WINDOW ID”就可以获取该Window的所有view控件信息(比如发送DUMP -1,就可以获取到当前界面最上层具有焦点的Window的所有view控件的信息)。
请一并参阅图3和图4,图3为本发明实施例中电子设备显示的界面图,图4为针对该界面的视图抽象图,而本发明实现的展示界面则是这二者的结合,在展示界面上通过图像视图的方式把所有的视图展示出来,用户可以直接点击不需要的视图,将其从展示界面上去除掉。去除的视图会放置在取出界面,用户可以通过点击back键或者在取出界面点击该视图进行恢复。需说明的是,图3和图4仅为本发明的辅助效果说明图,以便于更好地解释本发明中的展示界面,其并不是本发明所要求的保护点。
为实现所述展示界面,所述步骤S200包括:
S201、解析所述视图控件信息,将指定窗口的所有视图控件组建成视图控件树;
S202、将视图控件树中每个视图控件的信息传输至对应的视图节点,并转换为对应视图节点的节点属性;
S203、根据所述视图节点的节点属性构建展示界面,所述展示界面包括与所有视图控件对应的图像视图。
首先对获取到的视图控件信息进行解析,将所有的控件组建成视图控件树,通过控件树可以得到所有的视图控件之间的关系,包括父view、子view及其对应关系等等,代码片段如下:
public ViewNode findViewById(String id) {
ViewNode rootNode = DeviceBridge.loadWindowData(
new Window(new ViewServerDevice(mDevice), "",0xffffffff));
if (rootNode == null) {
throw new RuntimeException("Could not dump view");
}
return findViewById(id, rootNode);
}
代码分析:
(1)初始化Window对象
new Window(new ViewServerDevice(mDevice), "", 0xffffffff)
具体实施时,会根据id信息遍历所有的window,例如0xffffffff即为-1,对应当前获得焦点的窗口。
(2)loadWindowData,获取window的所有view控件列表
代码片段如下:
connection = new DeviceConnection(window.getDevice());
connection.sendCommand("DUMP " + window.encode());
BufferedReader in = connection.getInputStream();
ViewNode currentNode = parseViewHierarchy(in, window);
ViewServerInfo serverInfo = getViewServerInfo(window.getDevice());
if (serverInfo != null) {
currentNode.protocolVersion = serverInfo.protocolVersion;
}
return currentNode;
代码分析:
connection.sendCommand("DUMP " + window.encode());
1> 发送DUMP command,获得view控件列表
2> ViewNode currentNode = parseViewHierarchy(in, window);
parseViewHierarchy用来解析ViewServer返回来的控件列表信息,通过对这个信息的解析,就可以把所有的控件组建成最终的控件树。
以下代码是parseViewHierarchy方法解析及组装view控件树的过程:
while ((line = in.readLine()) != null) {
if ("DONE.".equalsIgnoreCase(line)) {
break;
}
int depth = 0;
while (line.charAt(depth) == ' ') {
depth++;
}
while (depth <= currentDepth) {
if (currentNode != null) {
currentNode = currentNode.parent;
}
currentDepth--;
}
currentNode = new ViewNode(window, currentNode,line.substring(depth));
currentDepth = depth;
}
代码分析:
(1)为了构造控件树的模型,在每个控件前面加了空格,顶层view(DecorView)没有空格,它的子view有一个空格,依次类推。
(2)通过while一直从BufferedReader(in.readLine())中读取view控件的信息,一行信息就是一个View控件,然后将信息传入ViewNode对象,ViewNode解析该控件的信息,并且转换成自己对象的属性。
即在组建了视图控件树后,将视图控件树中每个视图控件的信息传输至对应的视图节点(ViewNode)对象,ViewNode解析该控件的信息,并转换为对应视图节点的节点属性,视图节点的节点属性中包涵了视图控件的信息,包括各个视图的id信息,以及宽,高,左上点的坐标,根据这3点,既能知道该视图处于界面的位置了,另外还包括父view(publicViewNode parent),子view(public List<ViewNode> children)等对应关系等等,当用户点击到任何一个view之后,通过id就能知道对应的ViewNode,相应的,这个view的属性,在界面中的位置,其父view,子view就可获取了,反之,当用户点击树状view控件中的任何一个view,我们也能根据id对应到屏幕上的view。代码片段如下:
public String id; // view的唯一标志id
public String name;
public List<Property> properties = new ArrayList();
public Map<String, Property> namedProperties = new HashMap();
public int left;
public int top;
public int width;
public int height;
public ViewNode parent;
public List<ViewNode> children = new ArrayList();
在得到了视图节点的属性之后根据所述节点属性构建展示界面,具体地,所述步骤S203包括:
S2031、将每个视图控件单独绘制成图片并保存;
S2032、根据所述节点属性中视图控件的位置信息,通过图像视图将对应的图片显示在相同位置形成展示界面。
本发明通过视图节点构建展示界面,首先把每个视图控件单独绘制成图片并保存,在展示界面中通过ImageView控件包装对应的图片进行显示,根据所述节点属性中视图控件的位置信息,通过图像视图将对应的图片显示在相同位置形成展示界面,即根据原始view的大小,位置,对应的设置imageview的大小和位置,一个一个viewNode的处理,从root到parent,再到child的顺序排列,当全部展现完的时候,展示界面就通过多个imageView组合的形式把所有view都展示出来了,以图片形式展示各个视图,方便用户后续选择。
具体地,所述步骤S300包括:
S301、接收用户对展示界面上图像视图的点击指令;
S302、当一图像视图被点击时,设置该图像视图对应的视图节点的标签信息为已移除,将其从当前展示界面移除;
S303、接收用户输入的保存指令并保存当前的显示界面。
本发明在显示了展示界面后,接收用户对展示界面上图像视图的点击指令,而imageView的点击事件为预先设置的,当用户点击imageView时,根据预先保存的视图的id信息,寻找对应的视图节点,将其tag即标签信息设置为removed(表示已移除),同时移除该imageView,当用户修改完之后,点击保存的时候,将剩下的视图保存即可得到所需截屏的界面。进一步地,为了方便用户在展示界面操作较小的view,在展示界面的imageview群组外面包裹一个scrollView,加上手势的判断,提供用户拖动,放大缩小界面的功能,更加方便用户操作。
本发明还相应提供一种电子设备的截屏系统,如图5所示,所述电子设备的截屏系统包括获取模块10、解析构建模块20、界面处理模块30和截屏模块40,所述获取模块10、解析构建模块20、界面处理模块30和截屏模块40依次连接,所述获取模块10用于获取电子设备当前显示的界面信息并进行解析,得到指定窗口的所有视图控件信息;所述解析构建模块20用于解析所述视图控件信息,将指定窗口的所有视图控件组建成视图控件树,并构建包括与所有视图控件对应的图像视图的展示界面;所述界面处理模块30用于接收用户对所述图像视图的点击指令,将被用户点击的图像视图从展示界面移除,并在接收到保存指令时保存当前的展示界面;所述截屏模块40用于截取当前屏幕的展示界面并保存。具体请参阅上述方法对应的实施例。
进一步地,所述获取模块10包括第一获取单元(图中未示出)和第二获取单元(图中未示出),所述第一获取单元连接第二获取单元,所述第一获取单元用于获取电子设备当前显示的界面信息,得到所有的窗口信息,并依次对各个窗口进行解析;所述第二获取单元用于根据获取指令获取指定窗口的所有视图控件信息。具体请参阅上述方法对应的实施例。
具体地,所述解析构建模块20包括解析单元(图中未示出)、信息处理单元(图中未示出)和构建单元(图中未示出),所述解析单元、信息处理单元和构建单元依次连接,所述解析单元用于解析所述视图控件信息,将指定窗口的所有视图控件组建成视图控件树;所述信息处理单元用于将视图控件树中每个视图控件的信息传输至对应的视图节点,并转换为对应视图节点的节点属性;所述构建单元用于根据所述视图节点的节点属性构建展示界面,所述展示界面包括与所有视图控件对应的图像视图。具体请参阅上述方法对应的实施例。
进一步地,所述构建单元包括绘图子单元(图中未示出)和显示单元(图中未示出),所述绘图子单元连接显示单元,所述绘图子单元用于将每个视图控件单独绘制成图片并保存;所述显示单元用于根据所述节点属性中视图控件的位置信息,通过图像视图将对应的图片显示在相同位置形成展示界面。具体请参阅上述方法对应的实施例。
更进一步地,所述界面处理模块30指令接收单元(图中未示出)、标签设置单元(图中未示出)和保存单元(图中未示出),所述指令接收单元、标签设置单元和保存单元依次连接,所述指令接收单元用于接收用户对展示界面上图像视图的点击指令;所述标签设置单元用于当一图像视图被点击时,设置该图像视图的标签信息为已移除,将其从当前展示界面移除;所述保存单元用于接收用户输入的保存指令并保存当前的显示界面。具体请参阅上述方法对应的实施例。
综上所述,本发明提供的电子设备的截屏方法及系统中,所述电子设备的截屏方法通过获取电子设备当前显示的界面信息并进行解析,得到指定窗口的所有视图控件信息;之后解析所述视图控件信息,将指定窗口的所有视图控件组建成视图控件树,并构建包括与所有视图控件对应的图像视图的展示界面;之后接收用户对所述图像视图的点击指令,将被用户点击的图像视图从展示界面移除,并在接收到保存指令时保存当前的展示界面,之后截取当前屏幕的展示界面并保存。通过对当前显示界面的解析重构,将所有视图都呈现在展示界面中,用户可以自由选择不希望截取的部分,最后生成所需的截图,使得截屏体验更加丰富,且更加贴合用户的多种需求,实现了自由截屏功能。
可以理解的是,对本领域普通技术人员来说,可以根据本发明的技术方案及其发明构思加以等同替换或改变,而所有这些改变或替换都应属于本发明所附的权利要求的保护范围。