显示标注控件的方法及装置
技术领域
本发明涉及计算机领域,具体而言,涉及一种显示标注控件的方法及装置。
背景技术
标注控件是Silverlight中的控件,通常标注控件(Callout)包括两部分,如图1所示,由小三角形标注箭头(Anchor)和长方形组成,通常在点击按钮之后,在按钮的旁边弹出。
这里需要说明的是,当用户打开应用程序,比如说Silverlight程序之后,点击按钮时,弹出的标注控件(Callout)可能会超出整个Silverlight界面边界的情况,如图2 所示,此时标注控件(Callout)超出了Silverlight的边界,导致标注控件(Callout) 不能完整显示。
针对现有技术中弹出的标注控件可能会超出应用程序界面边界,导致标注控件不能完整显示的问题,目前尚未提出有效的解决方案。
发明内容
本发明的主要目的在于提供一种显示标注控件的方法,以解决现有技术中弹出的标注控件可能会超出应用程序界面边界,导致标注控件不能完整显示的问题。
为了实现上述目的,根据本发明实施例的一个方面,提供了一种显示标注控件的方法,该方法包括:获取显示在应用程序界面中的标注控件的标注箭头的顶点坐标;根据标注箭头的顶点坐标确定标注箭头的初始方向;根据标注箭头的初始方向构建标注箭头的方向集合,其中,标注箭头的方向集合至少包括标注箭头的初始方向;从标注箭头的方向集合中确定标注箭头的标准方向;根据标注箭头的标准方向对标注控件进行位移。
为了实现上述目的,根据本发明实施例的另一方面,提供了一种显示标注控件的装置。该装置包括:获取单元,用于获取显示在应用程序界面中的标注控件的标注箭头的顶点坐标;第一确定单元,用于根据标注箭头的顶点坐标确定标注箭头的初始方向;构建单元,用于根据标注箭头的初始方向构建标注箭头的方向集合,其中,标注箭头的方向集合至少包括标注箭头的初始方向;第二确定单元,用于从标注箭头的方向集合中确定标注箭头的标准方向;位移单元,用于根据标注箭头的标准方向对标注控件进行位移。
根据发明实施例,通过获取显示在应用程序界面中的标注控件的标注箭头的顶点坐标;根据标注箭头的顶点坐标确定标注箭头的初始方向;根据标注箭头的初始方向构建标注箭头的方向集合,其中,标注箭头的方向集合至少包括标注箭头的初始方向;从标注箭头的方向集合中确定标注箭头的标准方向;根据标注箭头的标准方向对标注控件进行位移,解决了现有技术中应用程序中弹出的标注控件可能会超出应用程序界面边界,导致标注控件不能完整显示的问题。
附图说明
构成本申请的一部分的附图用来提供对本发明的进一步理解,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:
图1是根据本发明实施例的标注控件的示意图;
图2是根据本发明实施例的标注控件在应用程序中显示的示意图;
图3是根据本发明实施例一的显示标注控件的方法的流程图;
图4是根据本发明实施例一的可选的显示标注控件的方法的示意图;
图5是根据本发明实施例一的可选的显示标注控件的方法的示意图;
图6是根据本发明实施例一的可选的显示标注控件的方法的示意图;
图7是根据本发明实施例一的可选的显示标注控件的方法的示意图;
图8是根据本发明实施例二的显示标注控件的装置的结构示意图;
图9是根据本发明实施例二的可选的显示标注控件的装置的结构示意图;以及
图10是根据本发明实施例二的可选的显示标注控件的装置的结构示意图。
具体实施方式
需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。下面将参考附图并结合实施例来详细说明本发明。
为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。
需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、***、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
实施例一
本发明实施例一提供了一种显示标注控件(Callout)的方法。
图3是根据本发明实施例一的显示标注控件(Callout)的方法的流程图。如图3 所示,该方法包括步骤如下:
步骤S10,获取显示在应用程序界面中的标注控件(Callout)的标注箭头(Anchor)的顶点坐标。
具体的,如图4所示,箭头方向为x、y轴正方向,标注控件(Callout)宽度为x 轴1个单位长度,标注控件(Callout)高度为y轴1个单位长度,标注箭头(Anchor) Point的坐标即为标注箭头(Anchor)中不在长方形边上的那个点的坐标,可选的,图 4中所示的标注箭头(Anchor)的坐标为(0.2,1.2)。这里需要说明的是,上述标注箭头 (Anchor)的坐标以标注控件(Callout)的左上角为坐标原点。
步骤S20,根据标注箭头(Anchor)的顶点坐标确定标注控件(Callout)的初始方向。
具体的,结合图4,可以看出当标注箭头(Anchor)Point为(0.2,1.2)时,上述标注控件(Callout)相对于按钮的位置为上,上述标注控件(Callout)的方向即为标注箭头(Anchor)的方向。在本方案中可以通过标注箭头(Anchor)顶点的坐标值可以判断出标注箭头(Anchor)的方向,可选的,本实施例提供了一种判断标注箭头(Anchor) 方向的规则,如表1所示。
表1:
左 |
X>1and Y<X and Y>1–X |
右 |
X<0and Y<=1-X and Y>X |
上 |
Y>1&&X<=Y&&X>1-Y |
下 |
Y<0&&X>=Y&&X<=1-Y) |
无 |
Y>=0&&Y<=1&&X>=0&&X<=1 |
这里需要说明的是,本申请全文中的标注箭头(Anchor)或标注控件(Callout) 的方向都为标注箭头(Anchor)或标注控件(Callout)相对于按钮位置的方向。
例如,当标注箭头(Anchor)的顶点的横纵坐标中满足条件X>1and Y<X and Y> 1–X时,标注箭头(Anchor)相对于按钮的方向则为左。这里需要说明的是,结合图4所示,当标注箭头(Anchor)的顶点的横纵坐标满足条件Y>=0&&Y<=1&& X>=0&&X<=1时,标注控件(Callout)是没有标注箭头(Anchor)的,可以理解为,标注箭头(Anchor)不存在方向。
步骤S30,根据标注箭头(Anchor)的初始方向构建标注箭头(Anchor)的方向集合,其中,标注箭头(Anchor)的方向集合至少包括标注箭头(Anchor)的初始方向。
具体的,可以构建包括标注箭头(Anchor)的初始方向的其他所有方向的集合,可选的,当标注箭头(Anchor)的初始方向为左,则根据标注箭头(Anchor)的向左的方向数据分别获得标注箭头(Anchor)的向右、向下、向上的等方向数据,从而构建方向集合,这里需要说明的是,当标注箭头(Anchor)的初始方向为无,那么标注箭头(Anchor)的方向集合与初始方向标注箭头(Anchor)的初始方向相同,即都为无。
步骤S40,从标注箭头(Anchor)的方向集合中确定标注箭头(Anchor)的标准方向。
具体的,可以依次遍历上述标注箭头(Anchor)的方向集合,来判断上述哪个标注箭头(Anchor)方向对应的标注控件(Callout)没有超出上述Silverlight应用程序的页面边界,从而判断出标注箭头(Anchor)的标准方向,即在标注箭头(Anchor) 的方向为标准方向的情况下,标注箭头(Anchor)对应的标注控件(Callout)没有超出Silverlight应用程序的页面边界,在上述应用程序中可以全部显示标注控件 (Callout)。
步骤S50,根据标注箭头(Anchor)的标准方向对标注控件(Callout)进行位移。
具体的,因为在标注箭头(Anchor)的方向为标准方向的情况下,标注箭头(Anchor) 对应的标注控件(Callout)没有超出Silverlight应用程序的页面边界,所以根据标注箭头(Anchor)的标准方向来确定标注控件(Callout)初始位置的位移轨迹,使得将标注控件(Callout)进行位移后,如图5所示,标注控件(Callout)中的标注箭头(Anchor)方向为标准方向,这样,标注控件(Callout)会全部显现出来。
本发明实施例通过根据标注箭头(Anchor)的顶点坐标确定标注箭头(Anchor) 的初始方向,再根据上述初始方向获得标注箭头(Anchor)的标准方向,进行根据标注箭头(Anchor)的标准方向对上述标注控件(Callout)进行位移,使得标注控件 (Callout)会全部显现在上述应用程序中,本发明解决了现有技术中弹出的标注控件 (Callout)可能会超出应用程序界面边界,导致标注控件(Callout)不能完整显示的问题。
可选的,上述步骤S30,根据标注箭头(Anchor)的初始方向构建标注箭头(Anchor)的方向集合的步骤还可以包括:
步骤S300,根据标注箭头(Anchor)的顶点坐标计算生成标注箭头(Anchor)的初始方向之外的以下至少一个标注箭头(Anchor)方向对应的顶点坐标:向左、向右、向上、向下。
这里需要说明的是,上述标注箭头(Anchor)的方向为标注箭头(Anchor)相对于按钮的方向。
具体的,可以根据上述标注箭头(Anchor)的初始方向对应的顶点坐标来计算标注箭头(Anchor)的初始方向对应的其他方向的顶点坐标即新顶点坐标,可选的,本实施例提供了一种计算上述新顶点坐标的规则,如表2至表5所示,这里需要说明的是,表2至表5中的NewX、NewY参数用来表示上述新顶点坐标。
表2:
左
X<=0 |
NewX=1-X |
X>0and X<1 |
NewX=1+X |
其他 |
NewX=X |
Y>=NewX |
NewY=Y-NewX |
Y<1-NewX |
NewY=Y-1+NewX |
其他 |
NewY=Y |
表3:
右
X>=0and X<=1 |
NewX=-X |
X>1 |
NewX=1-X |
其他 |
NewX=X |
Y>=1-NewX |
NewY=Y-1+NewX |
Y<=NewX |
NewY=Y-NewX |
其他 |
NewY=Y |
表4:
上
表5:
下
Y>=0and Y<=1 |
NewY=-Y |
Y>1 |
NewY=1-Y |
其他 |
NewY=Y |
X>NewY |
NewX=X-NewY |
X>1-NewY |
NewX=X-1+NewY |
其他 |
NewX=X |
例如,当标注箭头(Anchor)的初始方向为向左时,则通过表3至表5来计算标注箭头(Anchor)的初始方向所对应的向右,向上、向下的新顶点坐标,其中,所述标注箭头(Anchor)的初始方向为标注箭头(Anchor)相对于上述按钮位置的方向。
这里需要说明的是,当标注箭头(Anchor)的初始方向为无时,即标注控件(Callout) 不包括标注箭头(Anchor)时,标注箭头(Anchor)的初始方向对应的方向集合就是标注箭头(Anchor)的初始方向本身,因此,在本实施例中没有计算方向为无的公式。
这里还需要说明的是,通过新的标注箭头(Anchor)的顶点坐标形成的新的标注箭头形状和旧的标注箭头(Anchor)的形状一致,这样保证如果原有的标注箭头 (Anchor)所对应的标注控件(Callout)超出Silverlight边界,那么在使用新的标注箭头时,标注箭头(Anchor)以及标注箭头对应的标注控件的形状和原有的是一致的,如图6所示的标注箭头(Anchor)形状相同的四个方向的标注控件(Callout)。
步骤S301,根据至少一个标注箭头(Anchor)方向对应的顶点坐标构建标注箭头(Anchor)的方向集合,其中,标注箭头(Anchor)的方向集合包括标注箭头(Anchor) 的初始方向和标注箭头(Anchor)在任意空间方位中的其他方向。
可选的,步骤S40,从标注箭头(Anchor)的方向集合中确定标注箭头(Anchor) 的标准方向的步骤还可以包括:
步骤S401,依次验证标注箭头(Anchor)的方向集合中各个方向对应的标注控件(Callout)是否超出应用程序界面的区域。
具体的,在构建标注箭头(Anchor)的方向集合后,可以依次对标注箭头(Anchor)的方向集合中任意一个方向进行验证,即判断标注箭头(Anchor)处于哪种方向下,该方向对应的标注控件(Callout)没有超出上述应用程序界面的区域。
步骤S402,在标注箭头(Anchor)的方向集合中的第一方向对应的标注控件(Callout)没有超出应用程序界面的区域的情况下,确定标注箭头(Anchor)的方向集合中的第一方向为标注箭头(Anchor)的标准方向。
具体的,在上述标注箭头(Anchor)的方向集合中的任意一个方向满足对应的标注控件(Callout)没有超出应用程序界面的区域的情况下,该方向即为标准方向。
可选的,在本发明提供的一种可选的实施例中,当标注箭头(Anchor)的顶点坐标位于应用程序界面中的Button的边界上时,上述步骤S401,依次验证标注箭头 (Anchor)的方向集合中各个方向对应的标注控件(Callout)是否超出应用程序界面的区域的步骤还可以包括:
步骤S4010,获取到的应用程序界面的宽度和高度、标注控件(Callout)的宽度和高度和Button的坐标。
具体的,上述应用程序可以优选为Silverlight应用程序,首先获取Silverlight区域的宽度TotalWidth和高度TotalHeight,然后获取标注控件(Callout)的宽度Width和标注控件(Callout)的高度Height,Button的宽度ButtonWidth和高度ButtonHeight,Button相对于Silverlight区域左上角的坐标X、Y,上述方向集合中的任一方向对应的标注箭头(Anchor)的顶点的坐标AX、AY,这里需要说明的是,上述AX、AY即为上述表2至表5中的NewX、NewY,即标注箭头(Anchor)的新顶点坐标,而Button 相对于Silverlight区域左上角的坐标X、Y是以Silverlight区域左上角的顶点为原点。
步骤S4011,根据应用程序界面的宽度和高度、标注控件(Callout)的宽度和高度和Button的坐标来确定标注控件(Callout)是否超出应用程序界面的区域。
具体的,本发明实施例提供的了上述方向集合中的每个方向的判断逻辑,如下表6,遍历上述方向集合中的各个方向,当方向集合中的任一方向所对应的若干数据满足表6中的条件时,则说明该方向所对应的标注控件没有超出应程序的页面边界。
表6:
左 |
X>Width*AX |
右 |
TotalWidth-X-ButtonWidth>(1-AX)*Width |
上 |
Y>AY*Height |
下 |
TotalHeight-Y-ButtonHeight>(1-AY)*Height |
无 |
True |
这里需要说明的是,只要其中一个方向满足表格中的条件就退出遍历,这个方向就是标注控件(Callout)的标注箭头(Anchor)的新方向,如果该方向和初始标注箭头(Anchor)方向不一致,标注箭头(Anchor)Point则使用新方向对应的标注箭头 (Anchor)作为标准方向对应的标注箭头。
这里还需要说明的是,在标注箭头(Anchor)的方向集合中仅为无的情况下时,应用程序界面可以容纳标注控件(Callout),上述判断结果直接为True。
可选的,步骤S50,根据标注箭头(Anchor)的标准方向对标注控件(Callout) 进行位移的步骤还可以包括:
步骤S501,计算标注控件(Callout)左上角坐标与Button的左上角的坐标的坐标偏移量。
步骤S502,根据坐标偏移量将标注控件(Callout)的左上角移动至Button的左上角处。
具体的,在本实施例中,首先计算标注控件(Callout)左上角坐标和Button左上角坐标偏移量,根据这个偏移量,将标注控件(Callout)左上角移至Button左上角处。
步骤S503,根据标注箭头(Anchor)的标准方向对应的标注箭头(Anchor)的顶点坐标、标注控件(Callout)的宽度和高度、Button的高度和宽度计算水平位移量和垂直位移量。
具体的,可以根据标注箭头(Anchor)的标准方向位移标注控件(Callout),其中,水平位移量记做HOffset,垂直位移量记做VOffset,标注箭头(Anchor)的顶点坐标为X、Y,标注控件(Callout)宽度和高度为Width、Height,Button宽度和高度为 ButtonWidth、ButtonHeight,计算水平位移量和垂直位移量的方法见下表7。
表7:
步骤S504,标注控件(Callout)按照水平位移量和垂直位移量进行位移。
这里需要说明的是,从上面表格的计算也可以看出标注控件(Callout)的标注箭头(Anchor)顶点正好在Button某个边的中点处,这样可以让标注控件(Callout)在应用程序中显示更加美观。
下面本申请在一种具体应用场景下描述本方案:
标注控件(Callout)是Silverlight中的一个控件,其中标注箭头(Anchor)为图4中的那个小三角形,如图4所示。标注箭头(Anchor)的形状由标注箭头(Anchor) Point属性来控制,标注箭头(Anchor)Point定义X、Y两个属性,表示在X、Y轴单位长度,其控制逻辑如下:
如图4中坐标轴所示,箭头方向为x、y轴正方向,标注控件(Callout)宽度为x 轴1个单位长度,标注控件(Callout)高度为y轴1个单位长度,标注箭头(Anchor) Point指定的坐标即为标注箭头(Anchor)中不在长方形边上的那个点,图4所示的标注箭头(Anchor)Point为(0.2,1.2)。
在现有的程序中比如Silverlight中会存在如下的使用场景:通常标注控件(Callout) 都是在点击按钮以后,在按钮旁弹出,这里的问题是弹出的标注控件(Callout)可能会超出整个Silverlight边界的情况,此时标注控件(Callout)不能完整显示,此时我们希望标注控件(Callout)可以自动调整为在Silverlight区域内显示。
如图2所示,标注控件(Callout)超出了Silverlight的边界,此时我们希望可以自动调整为下图所5示的样子,基于此,本申请提供了方案如下:
第一,根据标注箭头(Anchor)Point的X、Y坐标计算标注控件(Callout)的标注箭头(Anchor)方向,结合图7为标注箭头(Anchor)在四个方向时标注箭头(Anchor) Point坐标。
结合图7,可以看出,根据X、Y坐标我们能够判断出标注箭头(Anchor)方向,具体逻辑如表8:
表8:
左 |
X>1and Y<X and Y>1–X |
右 |
X<0and Y<=1-X and Y>X |
上 |
Y>1&&X<=Y&&X>1-Y |
下 |
Y<0&&X>=Y&&X<=1-Y) |
无 |
Y>=0&&Y<=1&&X>=0&&X<=1 |
这里需要说明的是,上述表格中的方向为标注箭头(Anchor)相对于按钮位置的方向。
第二,根据标注箭头(Anchor)方向构建方向集合,其逻辑为:如果当前箭头方向为无的话(即此时标注控件(Callout)没有标注箭头(Anchor)),集合包含方向无,否则集合项依次为当前方向,对面方向,相邻两个方向
第三,依次遍历方向集合中每个方向,目的是为了验证在该方向标注控件(Callout) 是否超出Silverlight边界(详见第4步描述),如果这个方向不是标注控件(Callout) 的原始标注箭头(Anchor)方向的话,获取这个方向对应的标注箭头(Anchor)Point,新的标注箭头(Anchor)Point保证标注箭头(Anchor)形状和旧的标注箭头(Anchor)Point时的标注箭头(Anchor)形状一致,这样保证如果原有的标注箭头(Anchor)Point 情况下标注控件(Callout)超出Silverlight边界,那么在使用新的标注箭头(Anchor) Point时,标注箭头(Anchor)形状和原有的是一致的,如下所示标注箭头(Anchor) 形状相同的四个方向的标注控件(Callout):
具体逻辑如下表10至表13,其中新方向对应的标注箭头(Anchor)Point的X、 Y坐标使用NewX、NewY表示:
表10:
左
X<=0 |
NewX=1-X |
X>0and X<1 |
NewX=1+X |
Y>=NewX |
NewY=Y-NewX |
Y<1-NewX |
NewY=Y-1+NewX |
表11:
右
X>=0and X<=1 |
NewX=-X |
X>1 |
NewX=1-X |
Y>=1-NewX |
NewY=Y-1+NewX |
Y<=NewX |
NewY=Y-NewX |
表12:
上
Y<=0 |
NewY=1-Y |
Y>0and Y<1 |
NewY=1+Y |
X>NewY |
NewX=X-NewY |
X<1-NewY |
NewX=X-1+NewY |
表13:
下
Y>=0and Y<=1 |
NewY=-Y |
Y>1 |
NewY=1-Y |
X>NewY |
NewX=X-NewY |
X>1-NewY |
NewY=X-1+NewY |
这里需要说明的是,计算“无方向”这种情况是不会出现的,因为在标注箭头(Anchor)方向为上、下、左、右中任意一个时,获取到的集合方向中是不会包含无的。标注箭头(Anchor)方向为无时,获取到的集合方向中只有无,此时和标注箭头 (Anchor)原始方向相同,因此不会获取这个方向的标注箭头(Anchor)Point。
第四,依次判断各个方向判断是否可以容纳标注控件(Callout),具体逻辑如下:
首先获取Silverlight区域的宽度TotalWidth和高度TotalHeight,然后获取标注控件(Callout)的宽度Width和标注控件(Callout)的高度Height,Button的宽度ButtonWidth和高度ButtonHeight,Button相对于Silverlight区域左上角的坐标X、Y,该方向对应的标注箭头(Anchor)Point的坐标AX、AY,每个方向的判断逻辑如下表 14,true可以容纳,false不可以容纳。
表14:
左 |
X>Width*AX |
右 |
TotalWidth-X-ButtonWidth>(1-AX)*Width |
上 |
Y>AY*Height |
下 |
TotalHeight-Y-ButtonHeight>(1-AY)*Height |
无 |
True |
只要其中一个方向返回true就退出遍历,这个方向就是标注控件(Callout)的标注箭头(Anchor)的方向,如果该方向和原始标注箭头(Anchor)方向不一致,标注箭头(Anchor)Point使用新方向对应的标注箭头(Anchor)Point
第五,对标注控件(Callout)进行位移,步骤如下:
首先计算标注控件(Callout)左上角坐标和Button左上角坐标偏移量,根据这个偏移量,将标注控件(Callout)左上角移至Button左上角处
然后根据标注箭头(Anchor)方向位移标注控件(Callout),水平位移量记做HOffset,垂直位移量记做VOffset,标注箭头(Anchor)Point坐标为X、Y,标注控件(Callout)宽度和高度为Width、Height,Button宽度和高度为ButtonWidth、ButtonHeight,逻辑见下表15:
表15
从上面计算也可以看出标注控件(Callout)的标注箭头(Anchor)顶点正好在Button 某个边的中点处,这样是为了美观。
综上,本申请根据标注控件(Callout)原始标注箭头(Anchor)Point设置,通过一系列计算,保证标注控件(Callout)不会超出Silverlight边界,在超出边界时自动将标注控件(Callout)调整到Silverlight边界内,同时,调整过程中标注控件(Callout) 的标注箭头(Anchor)形状没有发生变化,因为标注箭头(Anchor)形状通常都是设计好的,这样的形状最美观,最符合产品需求,本方案只是调整了标注控件(Callout) 位置,而没有修改标注控件(Callout)的标注箭头(Anchor)形状,最大程度保留了原始的设计。
实施例二
本发明实施例还提供了一种显示标注控件(Callout)的装置,如图8所示,该装置可以包括:
获取单元10,用于获取显示在应用程序界面中的标注控件(Callout)的标注箭头(Anchor)的顶点坐标。
具体的,结合图4所示,箭头方向为x、y轴正方向,标注控件(Callout)宽度为x轴1个单位长度,标注控件(Callout)高度为y轴1个单位长度,标注箭头(Anchor) Point的坐标即为标注箭头(Anchor)中不在长方形边上的那个点的坐标,可选的,图 4中所示的标注箭头(Anchor)的坐标为(0.2,1.2)。这里需要说明的是,上述标注箭头 (Anchor)Point的坐标以标注控件(Callout)的左上角为坐标原点。
第一确定单元20,用于根据标注箭头(Anchor)的顶点坐标确定标注箭头(Anchor)的初始方向。
具体的,结合图4,可以看出当标注箭头(Anchor)Point为(0.2,1.2)时,上述标注控件(Callout)的方向为上,上述标注控件(Callout)的方向即为标注箭头(Anchor) 的方向。在本方案中可以通过标注箭头(Anchor)的顶点的坐标值可以判断出标注箭头(Anchor)的方向,可选的,本实施例提供了一种判断标注箭头(Anchor)方向的规则,如表16所示。
表16:
左 |
X>1and Y<X and Y>1–X |
右 |
X<0and Y<=1-X and Y>X |
上 |
Y>1&&X<=Y&&X>1-Y |
下 |
Y<0&&X>=Y&&X<=1-Y) |
无 |
Y>=0&&Y<=1&&X>=0&&X<=1 |
这里需要说明的是,本申请全文中的标注箭头(Anchor)或标注控件(Callout) 的方向都为标注箭头(Anchor)或标注控件(Callout)相对于按钮位置的方向。
例如,当标注箭头(Anchor)的顶点的横纵坐标中满足条件X>1and Y<X and Y> 1–X时,标注箭头(Anchor)的方向则为左。这里需要说明的是,结合图4所示,当标注箭头(Anchor)的顶点的横纵坐标满足条件Y>=0&&Y<=1&&X>=0&&X <=1时,标注控件(Callout)是没有标注箭头(Anchor)的,可以理解为,标注箭头 (Anchor)不存在方向。
构建单元30,用于根据标注箭头(Anchor)的初始方向构建标注箭头(Anchor) 的方向集合,其中,标注箭头(Anchor)的方向集合至少包括标注箭头(Anchor)的初始方向。
具体的,可以构建包括标注箭头(Anchor)的初始方向的其他所有方向的集合,可选的,当标注箭头(Anchor)的初始方向为左,则根据标注箭头(Anchor)的向左的方向数据分别获得标注箭头(Anchor)的向右、向下、向上的等方向数据,从而构建方向集合,这里需要说明的是,当标注箭头(Anchor)的初始方向为无,那么标注箭头(Anchor)的方向集合与初始方向标注箭头(Anchor)的初始方向相同,即都为无。
这里需要说明的是,上述标注箭头(Anchor)的初始方向为标注箭头(Anchor) 相对于按钮的位置的方向。
第二确定单元40,用于从标注箭头(Anchor)的方向集合中确定标注箭头(Anchor)的标准方向。
具体的,可以依次遍历上述标注箭头(Anchor)的方向集合,来判断上述哪个标注箭头(Anchor)方向对应的标注控件(Callout)没有超出上述Silverlight应用程序的页面边界,从而判断出标注箭头(Anchor)的标准方向,即在标注箭头(Anchor) 的方向为标准方向的情况下,标注箭头(Anchor)对应的标注控件(Callout)没有超出Silverlight应用程序的页面边界,在上述应用程序中可以全部显示标注控件 (Callout)。
位移单元50,用于根据标注箭头(Anchor)的标准方向对标注控件(Callout)进行位移。
具体的,因为在标注箭头(Anchor)的方向为标准方向的情况下,标注箭头(Anchor) 对应的标注控件(Callout)没有超出Silverlight应用程序的页面边界,所以根据标注箭头(Anchor)的标准方向来确定标注控件(Callout)初始位置的位移轨迹,使得将标注控件(Callout)进行位移后,如图5所示,标注控件(Callout)中的标注箭头(Anchor)方向为标准方向,这样,标注控件(Callout)会全部显现出来。
本发明实施例通过根据标注箭头(Anchor)的顶点坐标确定标注箭头(Anchor) 的初始方向,再根据上述初始方向获得标注箭头(Anchor)的标准方向,进行根据标注箭头(Anchor)的标准方向对上述标注控件(Callout)进行位移,使得标注控件 (Callout)会全部显现在上述应用程序中,本发明解决了现有技术中弹出的标注控件 (Callout)可能会超出应用程序界面边界,导致标注控件(Callout)不能完整显示的问题。
可选的,如图9所示,上述构建单元30还可以包括:
生成模块300,用于根据标注箭头(Anchor)的顶点坐标计算生成标注箭头(Anchor)的初始方向之外的以下至少一个标注箭头(Anchor)方向对应的顶点坐标:向左、向右、向上、向下。
具体的,可以根据上述标注箭头(Anchor)的初始方向对应的顶点坐标来计算标注箭头(Anchor)的初始方向对应的其他方向的顶点坐标即新顶点坐标,可选的,本实施例提供了一种计算上述新顶点坐标的规则,如表17至表20所示,这里需要说明的是,表17至表20中的NewX、NewY参数用来表示上述新顶点坐标。
表17:
左
X<=0 |
NewX=1-X |
X>0and X<1 |
NewX=1+X |
其他 |
NewX=X |
Y>=NewX |
NewY=Y-NewX |
Y<1-NewX |
NewY=Y-1+NewX |
其他 |
NewY=Y |
表18:
右
X>=0and X<=1 |
NewX=-X |
X>1 |
NewX=1-X |
其他 |
NewX=X |
Y>=1-NewX |
NewY=Y-1+NewX |
Y<=NewX |
NewY=Y-NewX |
其他 |
NewY=Y |
表19:
上
Y<=0 |
NewY=1-Y |
Y>0and Y<1 |
NewY=1+Y |
其他 |
NewY=Y |
X>NewY |
NewX=X-NewY |
X<1-NewY |
NewX=X-1+NewY |
其他 |
NewX=X |
表20:
下
Y>=0and Y<=1 |
NewY=-Y |
Y>1 |
NewY=1-Y |
其他 |
NewY=Y |
X>NewY |
NewX=X-NewY |
X>1-NewY |
NewX=X-1+NewY |
其他 |
NewX=X |
例如,当标注箭头(Anchor)的初始方向为向左时,则通过表18至表20来计算标注箭头(Anchor)的初始方向所对应的向右,向上、向下的新顶点坐标。
这里需要说明的是,当标注箭头(Anchor)的初始方向为无时,即标注控件(Callout) 不包括标注箭头(Anchor)时,标注箭头(Anchor)的初始方向对应的方向集合就是标注箭头(Anchor)的初始方向本身,因此,在本实施例中没有计算方向为无的公式。
这里还需要说明的是,通过新的标注箭头(Anchor)的顶点坐标形成的新的标注箭头形状和旧的标注箭头(Anchor)的形状一致,这样保证如果原有的标注箭头 (Anchor)所对应的标注控件(Callout)超出Silverlight边界,那么在使用新的标注箭头时,标注箭头(Anchor)以及标注箭头对应的标注控件的形状和原有的是一致的,如图6所示的标注箭头(Anchor)形状相同的四个方向的标注控件(Callout)。
第一确定模块301,用于根据至少一个标注箭头(Anchor)方向对应的顶点坐标构建标注箭头(Anchor)的方向集合,其中,标注箭头(Anchor)的方向集合包括标注箭头(Anchor)的初始方向和标注箭头(Anchor)在任意空间方位中的其他方向。
可选的,如图10所示,上述第二确定单元40还可以包括:
验证模块401,用于依次验证标注箭头(Anchor)的方向集合中各个方向对应的标注控件(Callout)是否超出应用程序界面的区域。
具体的,在构建标注箭头(Anchor)的方向集合后,可以依次对标注箭头(Anchor)的方向集合中任意一个方向进行验证,即判断标注箭头(Anchor)处于哪种方向下,该方向对应的标注控件(Callout)没有超出上述应用程序界面的区域。
第二确定模块402,用于在标注箭头(Anchor)的方向集合中的第一方向对应的标注控件(Callout)没有超出应用程序界面的区域的情况下,确定标注箭头(Anchor) 的方向集合中的第一方向为标注箭头(Anchor)的标准方向。
具体的,在上述标注箭头(Anchor)的方向集合中的任意一个方向满足对应的标注控件(Callout)没有超出应用程序界面的区域的情况下,该方向即为标准方向。
可选的,上述验证模块401还可以包括:
子获取模块,用于获取到的应用程序界面的宽度和高度、标注控件(Callout)的宽度和高度和Button的坐标。
具体的,上述应用程序可以优选为Silverlight应用程序,首先获取Silverlight区域的宽度TotalWidth和高度TotalHeight,然后获取标注控件(Callout)的宽度Width和标注控件(Callout)的高度Height,Button的宽度ButtonWidth和高度ButtonHeight,Button相对于Silverlight区域左上角的坐标X、Y,上述方向集合中的任一方向对应的标注箭头(Anchor)的顶点的坐标AX、AY,这里需要说明的是,上述AX、AY即为上述表17至表20中的NewX、NewY,即标注箭头(Anchor)的新顶点坐标,而Button 相对于Silverlight区域左上角的坐标X、Y是以Silverlight区域左上角的顶点为原点。
子确定模块,用于根据应用程序界面的宽度和高度、标注控件(Callout)的宽度和高度和Button的坐标来确定标注控件(Callout)是否超出应用程序界面的区域。
具体的,本发明实施例提供的了上述方向集合中的每个方向的判断逻辑,如下表6,遍历上述方向集合中的各个方向,当方向集合中的任一方向所对应的若干数据满足表21中的条件时,则说明该方向所对应的标注控件没有超出应程序的页面边界。
表21:
左 |
X>Width*AX |
右 |
TotalWidth-X-ButtonWidth>(1-AX)*Width |
上 |
Y>AY*Height |
下 |
TotalHeight-Y-ButtonHeight>(1-AY)*Height |
无 |
True |
这里需要说明的是,只要其中一个方向满足表格中的条件就退出遍历,这个方向就是标注控件(Callout)的标注箭头(Anchor)的新方向,如果该方向和初始标注箭头(Anchor)方向不一致,标注箭头(Anchor)Point则使用新方向对应的标注箭头 (Anchor)作为标准方向对应的标注箭头。
这里还需要说明的是,在标注箭头(Anchor)的方向集合中仅为无的情况下时,应用程序界面可以容纳标注控件(Callout),上述判断结果直接为True。
可选的,上述位移单元50还可以包括:
第一计算模块,用于计算标注控件(Callout)左上角坐标与Button的左上角的坐标的坐标偏移量。
移动模块,用于根据坐标偏移量将标注控件(Callout)的左上角移动至Button的左上角处。
具体的,在本实施例中,首先计算标注控件(Callout)左上角坐标和Button左上角坐标偏移量,根据这个偏移量,将标注控件(Callout)左上角移至Button左上角处。
第二计算模块,用于根据标注箭头(Anchor)的标准方向对应的标注箭头(Anchor)的顶点坐标、标注控件(Callout)的宽度和高度、Button的高度和宽度计算水平位移量和垂直位移量。
具体的,可以根据标注箭头(Anchor)的标准方向位移标注控件(Callout),其中,水平位移量记做HOffset,垂直位移量记做VOffset,标注箭头(Anchor)的顶点坐标为X、Y,标注控件(Callout)宽度和高度为Width、Height,Button宽度和高度为 ButtonWidth、ButtonHeight,计算水平位移量和垂直位移量的方法见下表22。
表22:
位移模块504,用于将标注控件(Callout)按照水平位移量和垂直位移量进行位移。
这里需要说明的是,从上面表格的计算也可以看出标注控件(Callout)的标注箭头(Anchor)顶点正好在Button某个边的中点处,这样可以让标注控件(Callout)在应用程序中显示更加美观。
下面本申请在一种具体应用场景下描述本方案:
标注控件(Callout)是Silverlight中的一个控件,其中标注箭头(Anchor)为图4中的那个小三角形,如图4所示。标注箭头(Anchor)的形状由标注箭头(Anchor) Point属性来控制,标注箭头(Anchor)Point定义X、Y两个属性,表示在X、Y轴单位长度,其控制逻辑如下:
如图4中坐标轴所示,箭头方向为x、y轴正方向,标注控件(Callout)宽度为x 轴1个单位长度,标注控件(Callout)高度为y轴1个单位长度,标注箭头(Anchor) Point指定的坐标即为标注箭头(Anchor)中不在长方形边上的那个点,图4所示的标注箭头(Anchor)Point为(0.2,1.2)。
在现有的程序中比如Silverlight中会存在如下的使用场景:通常标注控件(Callout) 都是在点击按钮以后,在按钮旁弹出,这里的问题是弹出的标注控件(Callout)可能会超出整个Silverlight边界的情况,此时标注控件(Callout)不能完整显示,此时我们希望标注控件(Callout)可以自动调整为在Silverlight区域内显示。
如图2所示,标注控件(Callout)超出了Silverlight的边界,此时我们希望可以自动调整为下图所5示的样子,基于此,本申请提供了方案如下:
第一,根据标注箭头(Anchor)Point的X、Y坐标计算标注控件(Callout)的标注箭头(Anchor)方向,结合图7为标注箭头(Anchor)在四个方向时标注箭头(Anchor) Point坐标。
结合图7,可以看出,根据X、Y坐标我们能够判断出标注箭头(Anchor)方向,具体逻辑如表23:
表23:
左 |
X>1and Y<X and Y>1–X |
右 |
X<0and Y<=1-X and Y>X |
上 |
Y>1&&X<=Y&&X>1-Y |
下 |
Y<0&&X>=Y&&X<=1-Y) |
无 |
Y>=0&&Y<=1&&X>=0&&X<=1 |
这里需要说明的是,上述表格中的方向为标注箭头(Anchor)相对于按钮位置的方向。
第二,根据标注箭头(Anchor)方向构建方向集合,其逻辑为:如果当前箭头方向为无的话(即此时标注控件(Callout)没有标注箭头(Anchor)),集合包含方向无,否则集合项依次为当前方向,对面方向,相邻两个方向
第三,依次遍历方向集合中每个方向,目的是为了验证在该方向标注控件(Callout) 是否超出Silverlight边界(详见第4步描述),如果这个方向不是标注控件(Callout) 的原始标注箭头(Anchor)方向的话,获取这个方向对应的标注箭头(Anchor)Point,新的标注箭头(Anchor)Point保证标注箭头(Anchor)形状和旧的标注箭头(Anchor)Point时的标注箭头(Anchor)形状一致,这样保证如果原有的标注箭头(Anchor)Point 情况下标注控件(Callout)超出Silverlight边界,那么在使用新的标注箭头(Anchor) Point时,标注箭头(Anchor)形状和原有的是一致的,如下所示标注箭头(Anchor) 形状相同的四个方向的标注控件(Callout):
具体逻辑如下表24至表27,其中新方向对应的标注箭头(Anchor)Point的X、 Y坐标使用NewX、NewY表示:
表24:
左
X<=0 |
NewX=1-X |
X>0and X<1 |
NewX=1+X |
Y>=NewX |
NewY=Y-NewX |
Y<1-NewX |
NewY=Y-1+NewX |
表25:
右
表26:
上
Y<=0 |
NewY=1-Y |
Y>0and Y<1 |
NewY=1+Y |
X>NewY |
NewX=X-NewY |
X<1-NewY |
NewX=X-1+NewY |
表27:
下
这里需要说明的是,计算“无方向”这种情况是不会出现的,因为在标注箭头(Anchor)方向为上、下、左、右中任意一个时,获取到的集合方向中是不会包含无的。标注箭头(Anchor)方向为无时,获取到的集合方向中只有无,此时和标注箭头 (Anchor)原始方向相同,因此不会获取这个方向的标注箭头(Anchor)Point。
第四,依次判断各个方向判断是否可以容纳标注控件(Callout),具体逻辑如下:
首先获取Silverlight区域的宽度TotalWidth和高度TotalHeight,然后获取标注控件(Callout)的宽度Width和标注控件(Callout)的高度Height,Button的宽度ButtonWidth和高度ButtonHeight,Button相对于Silverlight区域左上角的坐标X、Y,该方向对应的标注箭头(Anchor)Point的坐标AX、AY,每个方向的判断逻辑如下表 28,true可以容纳,false不可以容纳。
表28:
左 |
X>Width*AX |
右 |
TotalWidth-X-ButtonWidth>(1-AX)*Width |
上 |
Y>AY*Height |
下 |
TotalHeight-Y-ButtonHeight>(1-AY)*Height |
无 |
True |
只要其中一个方向返回true就退出遍历,这个方向就是标注控件(Callout)的标注箭头(Anchor)的方向,如果该方向和原始标注箭头(Anchor)方向不一致,标注箭头(Anchor)Point使用新方向对应的标注箭头(Anchor)Point。
第五,对标注控件(Callout)进行位移,步骤如下:
首先计算标注控件(Callout)左上角坐标和Button左上角坐标偏移量,根据这个偏移量,将标注控件(Callout)左上角移至Button左上角处
然后根据标注箭头(Anchor)方向位移标注控件(Callout),水平位移量记做HOffset,垂直位移量记做VOffset,标注箭头(Anchor)Point坐标为X、Y,标注控件(Callout)宽度和高度为Width、Height,Button宽度和高度为ButtonWidth、ButtonHeight,逻辑见下表29:
表29
从上面计算也可以看出标注控件(Callout)的标注箭头(Anchor)顶点正好在Button 某个边的中点处,这样是为了美观。
综上,本申请根据标注控件原始标注箭头(Anchor)Point设置,通过一系列计算,保证标注控件不会超出Silverlight边界,在超出边界时自动将标注控件调整到Silverlight边界内,同时,调整过程中标注控件的标注箭头(Anchor)形状没有发生变化,因为标注箭头(Anchor)形状通常都是设计好的,这样的形状最美观,最符合产品需求,本方案只是调整了标注控件位置,而没有修改标注控件的标注箭头(Anchor) 形状,最大程度保留了原始的设计。
需要说明的是,对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明并不受所描述的动作顺序的限制,因为依据本发明,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本发明所必须的。
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。
在本申请所提供的几个实施例中,应该理解到,所揭露的装置,可通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个***,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可为个人计算机、移动终端、服务器或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。