具体实施方式
为使本发明解决的技术问题、采用的技术方案和达到的技术效果更加清楚,下面将结合附图对本发明实施例的技术方案作进一步的详细描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本实施例的可跟随屏幕自动旋转的浮窗实现方法主要应用于各种具有触摸屏的智能终端,包括智能手机、电子书阅读器、MP3(Moving Picture Experts GroupAudio Layer III,动态影像专家压缩标准音频层面3)播放器、MP4(Moving PictureExperts Group Audio Layer IV,动态影像专家压缩标准音频层面4)播放器、笔记本电脑、平板电脑等。该触摸屏包括电阻式触摸屏和电容式触摸屏。
总的来说,本技术提供一种通用且高效率的可跟随屏幕自动旋转的浮窗UI技术方案。首先提供一个支持旋转属性的ViewGroup,并用该ViewGroup作为待显示的UI浮窗的内容View的容器。通过inflater的inflate()方法生成对应的内容View并添加到上述的ViewGroup中。获取当前的Activity对应的Orientation并监听Activity栈顶以便跟随Activity对应的Orientation的变化;获取当前重力传感器的Orientation并注册重力传感器***以便跟随传感器的方向。根据传感器方向以及屏幕的Orientation进行旋转补偿,重新绘制浮窗,同时获得旋转逆矩阵。当用户在浮窗区域内进行点击的时候,对点击事件的坐标进行旋转逆变换,从而使得事件能够投递到对应的浮窗内部UI组件上。
请参考图1,其是本发明方法的实施例一,一种可跟随屏幕自动旋转的浮窗实现方法流程图(以下以Android***具体说明),包括:
S101、为待显示的UI浮窗视图提供支持旋转属性的画面容器;
首先提供一个支持旋转属性的ViewGroup(记为RotateLayout),并用该ViewGroup作为待显示的UI浮窗的View的容器。
S102、生成画面对应的内容并添加到所述画面容器中,所述的内容即为UI浮窗视图;
可通过inflater的inflate()方法生成对应的内容View(记为内容View:ContentView)并添加到上述的ViewGroup中。
根据Android的UI绘制原理,绘制的控制权会先交到RotateLayout,再由其传递给其内部的子View。
S103、获取***当前栈顶应用对应的方位属性以及***重力感应检测的方位,当***当前栈顶应用对应的方位或者/以及***重力感应检测的方位发生变化时,进行旋转补偿,重新绘制所述的UI浮窗,获得旋转逆矩阵;
其中,***为具有Android平台的终端,方位的角度为90度的倍数,Orientation包括四个值:正竖屏、反竖屏、正横屏、反横屏,约定对应的旋转角度(逆时针)值为0度、180度、90度、270度。
S104、对所述的用户点击事件的坐标进行旋转逆变换,从而使得事件能够投递到对应的浮窗内部UI组件上。
在RotateLayout的相关方法中,如onDraw()、dispatchDraw()、dispatchTouchEvent()、onLayout()、onMeasure()几个方法中,可以先进行旋转的补偿,使得子View的绘制、事件投递等变得跟没旋转一样,从而实现旋转的透明支持。
需要说明的是,对于不同的智能终端操作***或不同的实现浮窗技术的编程语言,UI绘制原理的程序可能有所区别,对于本领域普通技术人员来说,其可根据不同操作***或不同的编程语言实现画面容器重绘浮窗UI组件以及旋转逆转换。
综上,本发明实施例一的可跟随屏幕自动旋转的浮窗实现的方法,通过重绘浮窗以及坐标的旋转逆变换等“假象”生成的浮窗UI组件,不需要改动原有的浮窗UI组件,新绘的浮窗UI组件看起来像没发生旋转一样,克服了现有技术中浮窗UI组件实现旋转的功能,需要修改大量的UI组件,或需要准备多套画面候选,或需要动画显示等等效率低下,计算复杂的不足,本技术方案具有计算量较小,效率更高,浮窗UI组件外观更自然的有益效果。
请参考图2,其是本发明方法的实施例二,一种可跟随屏幕自动旋转的浮窗实现方法流程图,步骤S201、S202、S208分别与实施例一中的S101、S102、S104相同,不同之处在于步骤S203、S204、S205、S206、S207,该方法包括:
S201、为待显示的UI浮窗视图提供支持旋转属性的画面容器;
S202、生成画面对应的内容并添加到所述的画面容器中,所述的内容即为UI浮窗视图;
S203、获取***当前栈顶应用对应的方位以及***重力感应检测的方位,记为第一时刻;同时注册***的重力传感器***,启动***栈顶监控程序,设置监控的时间间隔值;
其中,设置监控的时间间隔值可以为30秒至2分钟,根据实际情况而定,在这段间隔时间内,有可能终端转动后方位发生了改变,也有可能终端转动后回到了原来的位置。通过预设的时间间隔可以更清楚用户的动作,做出更节省内存运算的操作。
S204、当***重力传感器发生方位变化的时候,会通告***,此时根据***重新计算新的***重力感应检测的方位值,记为第二时刻;
较佳地,该步骤包括:判断***重力传感器发生方位是否变化,若发生了变化,进入S204a、通告***,此时根据***重新计算新的***重力感应检测的方位值,记为第二时刻;若没有发生变化,进入S204b、丢弃获取的方位数据。
S205、比较第一时刻获取的方位以及第二时时刻获取的方位,若发生变化,则进行旋转补偿,重新绘制所述的浮窗,获得旋转逆矩阵;
较佳地,该步骤包括:判断第一时刻获取的方位以及第二时时刻获取的方位是否变化,若发生了变化,进入S205a、通告***,此时根据***重新计算新的***重力感应检测的方位值,记为第二时刻;若没有发生变化,进入S205b、丢弃获取的方位数据。
更进一步地,本实施例二中还具有以下的步骤:
S206、等待预设的时间间隔,再次获取***当前栈顶应用对应的方位值,记为第三时刻;
S207、比较第二时刻获取的方位以及第三时时刻获取的方位,若发生变化,则进行旋转补偿,重新绘制所述的浮窗,获得旋转逆矩阵。
较佳地,该步骤包括:判断第二时刻获取的方位以及第三时时刻获取的方位是否发生变生,若发生变化,返回上述的步骤S205a,若没有发生变化,丢弃当前获取的方位数据。
S208、对所述的用户点击事件的坐标进行旋转逆变换,从而使得事件能够准确投递到对应的浮窗内部UI组件上。
综上,本实施例中,由于时间间隔的存在,如果终端检测到第一时刻与第二时刻没有发生方位变化,则有可能如下的步骤:丢弃第二时刻的数据或返回步骤S203等等,只有当检测到发生方位的变化,才进行重新绘制所述的浮窗,获得旋转逆矩阵之类的操作,本技术方案具有计算量更小,效率更高,浮窗UI组件外观更自然的有益效果之外,更进一步节省了***的资源,同时,更进一步减少了内存数据的运算。
请参考图3,其是本发明实施例三,一种可跟随屏幕自动旋转的浮窗实现方法流程图,与上述的实施例一大部分步骤相同,即:步骤S301、S302、S306分别与实施例一中的S101、S102、S104相同,不同之处在于步骤S303、S304、S305,该方法包括:
S301、为待显示的UI浮窗视图提供支持旋转属性的画面容器;
S302、生成画面对应的内容并添加到所述的画面容器中,所述的内容即为UI浮窗视图;
S303、获取当前的用户点击事件的活动对应的第一方位并监听所述的活动的栈顶,以便跟随所述的活动的对应的方位进行变化。
通过获取用户点击的方位并监听方位,可以更进一步明确用户的动向。
S304、获取当前的重力传感器的第二方位并注册所述的重力传感器的***,以便跟随所述的重力传感器的方向进行变化。
通过获取重力传感器的方位并监听方位,可以更进一步明确终端发生转换的动向。
S305、若发生变化,进行旋转补偿,重新绘制所述的浮窗,获得旋转逆矩阵;
S306、对所述的用户点击事件的坐标进行旋转逆变换,从而使得事件能够投递到对应的浮窗内部UI组件上。
以Android平台举例说明,获取当前的Activity对应的Orientation(记为ContextOrientation)并监听Activity栈顶以便跟随Activity对应的Orientation的变化。
获取当前重力传感器的Orientation(记为SensorOrientation)并注册重力传感器***以便跟随传感器的方向。
综上,本实施例中,通过跟随所述的用户点击的活动以及重力传感器的对应的方位的变化,从而作出重新绘制所述的浮窗,获得旋转逆矩阵之类的操作,使浮窗UI组件实现更具体、更细致、更精确。本技术方案具有计算量较小,效率更高,浮窗UI组件外观更自然的有益效果之外,更进一步实现了浮窗UI组件的及时性、灵活性以及应对性。
对于实施例一至三中的旋转算法,更具体地说明如下:
Orientation包括四个值:正竖屏、反竖屏、正横屏、反横屏。约定对应的旋转角度(逆时针)值为0度、180度、90度、270度。把上面的两个Orientation依次转化为角度值,分别记为:ContextDegree,SensorDegree。
根据公式,计算补偿角度:
CompsateDegree=-ContextDegree+SensorDegree。
其中,获取当前的Activity(用户点击事件)对应的Orientation(记为ContextOrientation)并监听Activity栈顶以便跟随Activity对应的Orientation的变化。
获取当前重力传感器的Orientation(记为SensorOrientation)并注册重力传感器***以便跟随传感器的方向。
当发现重力传感器的SensorOrientation或栈底的ContextOrientation发生变化时,则依据上述的补偿公式进行相应的旋转补偿。根据Android的显示原理,这可以通过把上述的角度更新到RotateLayout ViewGroup的一个属性值中,并通过RotateLayout的requestLayout()强制触发UI的重新布局和绘制。整个重新布局和重新绘制过程主要如下:
1、onMeasure():若旋转后的角度为90度/270度,则在measureChild()前进行宽高置换,否则不变。
2、onLayout():通过当前的旋转角度,利用Matrix.setRotate()计算旋转补偿矩阵,并对RotateLayout的显示坐标(相当于外框)进行相应的旋转。
3、onDraw():对传递进来的Canvas进行旋转,使得RotateLayout的绘制本身体现出旋转的结果。
4、dispatchDraw():在分发Canvas给到子View之前,对该Canvas进行旋转补偿,补偿的方法即为根据当前旋转的角度alpha,对Canvas围绕RotateLayout的中心点进行-alpha的旋转,这样子View在绘制时将能够体现出旋转的特性。
上述的结果使得RotateLayout内的子View不需要处理任何旋转相关逻辑,因为所有的旋转都被RotateLayout补偿过了,子View看起来就像旋转没有发生过一样。而这种假象仅仅建立在绘制的基础之上。
当用户在浮窗内进行点击的时候,和上述重布局和重绘逻辑一样,此时也必须对点击坐标进行旋转补偿,以便事件能够投递到真正的控件上。主要是:在RotateLayout的dispatchTouchEvent()中,通过前述的旋转矩阵,对传递进来的MotionEvent的坐标值进行旋转的预处理之后,通过super.dispatchTouchEvent(MotionEvent)再把事件投递到对应的子View上。
以下为本发明实施例的可跟随屏幕自动旋转的浮窗实现的装置,与可跟随屏幕自动旋转的浮窗实现的方法属于同一构思,在可跟随屏幕自动旋转的浮窗实现的装置实施例中未详尽描述的细节内容,可以参考上述方法实施例。
请参考图4,其是本发明实施例一,一种可跟随屏幕自动旋转的浮窗实现装置1,包括:
画面容器提供单元100,用于为待显示的UI浮窗视图提供支持旋转属性的画面容器;
画面内容生成单元200,用于生成画面对应的内容并添加到所述的画面容器中,所述的内容即为UI浮窗视图;
方位获取单元300,用于获取用户点击事件的活动的方位以及***检测的方位,若发生变化,进行旋转补偿,重新绘制所述的浮窗,获得旋转逆矩阵;
坐标旋转逆变换单元400,用于对所述的用户点击事件的坐标进行旋转逆变换,从而使得事件能够投递到对应的浮窗内部UI组件上。
其中,所述的***为具有Android平台的终端***,所述的方位的角度为90度的倍数,所述生成画面对应的内容,包括:通过inflater的inflate()方法生成对应的内容View并添加到所述的画面容器中。
综上,本发明实施例一的可跟随屏幕自动旋转的浮窗实现的装置1,通过重绘浮窗以及坐标的旋转逆变换等“假象”生成的浮窗UI组件,不需要改动原有的浮窗UI组件,新绘的浮窗UI组件看起来像没发生旋转一样,克服了现有技术中浮窗UI组件实现旋转的功能,需要修改大量的UI组件,或需要准备多套画面候选,或需要动画显示等等效率低下,计算复杂的不足,本技术方案具有计算量较小,效率更高,浮窗UI组件外观更自然的有益效果。
请参考图5,其是本发明实施例二,一种可跟随屏幕自动旋转的浮窗实现装置2,包括第一实施例中的画面容器提供单元100,画面内容生成单元200、坐标旋转逆变换单元400,不同之处在于:方位获取单元300,具体如下:
画面容器提供单元100,用于为待显示的UI浮窗视图提供支持旋转属性的画面容器;
画面内容生成单元200,用于生成画面对应的内容并添加到所述的画面容器中,所述的内容即为UI浮窗视图;
第一时刻记录单元301,用于获取***当前栈顶应用对应的方位以及***重力感应检测的方位,记为第一时刻;同时注册***的重力传感器***,启动***栈顶监控程序,设置监控的时间间隔值;
设置监控的时间间隔值可以为30秒至2分钟,根据实际情况而定,在这段间隔时间内,有可能终端转动后方位发生了改变,也有可能终端转动后回到了原来的位置。通过预设的时间间隔可以更清楚用户的动作,做出更节省内存运算的操作。
第二时刻记录单元302,用于当***重力传感器发生方位变化的时候,会通告***,此时根据***重新计算新的***重力感应检测的方位值,记为第二时刻;
第一方位比较单元303,用于比较第一时刻获取的方位以及第二时时刻获取的方位,若发生变化,则进行旋转补偿,重新绘制所述的浮窗,获得旋转逆矩阵;
更进一步地,本实施例二中的第一方位比较单元303还具有以下单元:
第三时刻记录单元304,用于等待预设的时间间隔,再次获取***当前栈顶应用对应的方位值,记为第三时刻;
第二方位比较单元305,用于比较第二时刻获取的方位以及第三时时刻获取的方位,若发生变化,则进行旋转补偿,重新绘制所述的浮窗,获得旋转逆矩阵。
坐标旋转逆变换单元400、对用户点击事件的坐标进行旋转逆变换,从而使得事件能够准确投递到对应的浮窗内部UI组件上。
综上,本实施例中,由于时间间隔的存在,如果终端检测到第一时刻与第二时刻没有发生方位变化,则有可能如下的步骤:丢弃第二时刻的数据或返回第一时刻方位记录单元301等等,只有当检测到发生方位的变化,才进行重新绘制所述的浮窗,获得旋转逆矩阵的操作,本技术方案具有计算量较小,效率更高,浮窗UI组件外观更自然的有益效果之外,更进一步节省了***的资源,同时,更进一步减少了内存数据的运算。
请参考图6,其是本发明实施例三,一种可跟随屏幕自动旋转的浮窗实现装置,与上述图5中的实施例一大部分模块相同,该装置包括了画面容器提供单元100、画面内容生成单元200、标旋转逆变换单元400,不同之处在于:方位获取单元300,具体说明如下:
画面容器提供单元100,用于为待显示的UI浮窗视图提供支持旋转属性的画面容器;
画面内容生成单元200,用于生成画面对应的内容并添加到所述的画面容器中,所述的内容即为UI浮窗视图;
第一方位获取单元401,用于获取当前的用户点击事件的活动对应的第一方位并监听所述的活动的栈顶,以便跟随所述的活动的对应的方位进行变化。
通过获取用户点击的方位并监听方位,可以更进一步明确用户的动向。
重力传感器获取单元402,用于获取当前的重力传感器的第二方位并注册所述的重力传感器的***,以便跟随所述的重力传感器的方向进行变化。
通过获取重力传感器的方位并监听方位,可以更进一步明确终端发生转换的动向。
旋转补偿单元403,用于当第一方位或第二方位发生变化时,进行旋转补偿,重新绘制所述的浮窗,获得旋转逆矩阵;
标旋转逆变换单元400、对用户点击事件的坐标进行旋转逆变换,从而使得事件能够准确投递到对应的浮窗内部UI组件上。
以Android平台举例说明,获取当前的Activity对应的Orientation(记为ContextOrientation)并监听Activity栈顶以便跟随Activity对应的Orientation的变化。
获取当前重力传感器的Orientation(记为SensorOrientation)并注册重力传感器***以便跟随传感器的方向。
综上,本实施例中,通过跟随所述的用户点击的活动以及重力传感器的对应的方位进行变化,从而作出重新绘制所述的浮窗,获得旋转逆矩阵之类的操作,使浮窗UI组件实现更具体、更细致、更精确。本技术方案具有计算量较小,效率更高,浮窗UI组件外观更自然的有益效果之外,更进一步实现了浮窗UI组件的及时性、灵活性以及应对性。
对于上述装置实施例中提到的旋转算法,更具体地说明如下:
Orientation包括四个值:正竖屏、反竖屏、正横屏、反横屏。约定对应的旋转角度(逆时针)值为0度、180度、90度、270度。把上面的两个Orientation依次转化为角度值,分别记为:ContextDegree,SensorDegree。
根据公式,计算补偿角度:
CompsateDegree=-ContextDegree+SensorDegree。
当发现重力传感器的SensorOrientation或栈底的ContextOrientation发生变化时,则依据上述的补偿公式进行相应的旋转补偿。根据Android的显示原理,这可以通过把上述的角度更新到RotateLayout ViewGroup的一个属性值中,并通过RotateLayout的requestLayout()强制触发UI的重新布局和绘制。整个重新布局和重新绘制过程主要如下:
1、onMeasure():若旋转后的角度为90度/270度,则在measureChild()前进行宽高置换,否则不变。
2、onLayout():通过当前的旋转角度,利用Matrix.setRotate()计算旋转补偿矩阵,并对RotateLayout的显示坐标(相当于外框)进行相应的旋转。
3、onDraw():对传递进来的Canvas进行旋转,使得RotateLayout的绘制本身体现出旋转的结果。
4、dispatchDraw():在分发Canvas给到子View之前,对该Canvas进行旋转补偿,补偿的方法即为根据当前旋转的角度alpha,对Canvas围绕RotateLayout的中心点进行-alpha的旋转,这样子View在绘制时将能够体现出旋转的特性。
上述的结果使得RotateLayout内的子View不需要处理任何旋转相关逻辑,因为所有的旋转都被RotateLayout补偿过了,子View看起来就像旋转没有发生过一样。而这种假象仅仅建立在绘制的基础之上。
当用户在浮窗内进行点击的时候,和上述重布局和重绘逻辑一样,此时也必须对点击坐标进行旋转补偿,以便事件能够投递到真正的控件上。主要是:在RotateLayout的dispatchTouchEvent()中,通过前述的旋转矩阵,对传递进来的MotionEvent的坐标值进行旋转的预处理之后,通过super.dispatchTouchEvent(MotionEvent)再把事件投递到对应的子View上。
请参阅图7,实施例一,一种可跟随屏幕自动旋转的浮窗实现的终端10,包括终端本体500,终端10还具有与终端本体500相连的可跟随屏幕自动旋转的浮窗实现的装置1。
由于具有可跟随屏幕自动旋转的浮窗实现的装置1,故:
本技术方案中的终端通过重绘浮窗以及坐标的旋转逆变换等“假象”生成的浮窗UI组件,不需要改动原有的浮窗UI组件,新绘的浮窗UI组件看起来像没发生旋转一样,克服了现有技术中浮窗UI组件实现旋转的功能,需要修改大量的UI组件,或需要准备多套画面候选,或需要动画显示等等效率低下,计算复杂的不足,本技术方案具有计算量较小,效率更高,浮窗UI组件外观更自然的有益效果。
请参阅图8,实施例二,一种可跟随屏幕自动旋转的浮窗实现的终端20,包括终端本体500,终端20具有与终端本体500相连的可跟随屏幕自动旋转的浮窗实现的装置2。
由于具有可跟随屏幕自动旋转的浮窗实现的装置2,故:
由于时间间隔的存在,如果终端检测到第一时刻与第二时刻没有发生方位变化,则有可能如下的步骤:丢弃第二时刻的数据或返回第一时刻方位记录单元301等等,只有当检测到发生方位的变化,才进行重新绘制所述的浮窗,获得旋转逆矩阵之类的操作,本技术方案具有计算量较小,效率更高,浮窗UI组件外观更自然的有益效果之外,更进一步节省了***的资源,同时,更进一步减少了内存数据的运算。
请参阅图9,实施例三,一种可跟随屏幕自动旋转的浮窗实现的终端30,包括终端本体500,终端30还包括与终端本体500相连的可跟随屏幕自动旋转的浮窗实现的装置3。
由于具有可跟随屏幕自动旋转的浮窗实现的装置3,故:
本实施例中,终端30通过跟随所述的用户点击的活动以及重力传感器的对应的方位进行变化,从而作出重新绘制所述的浮窗,获得旋转逆矩阵之类的操作,使浮窗UI组件实现更具体、更细致、更精确。本技术方案具有计算量较小,效率更高,浮窗UI组件外观更自然的有益效果之外,更进一步实现了浮窗UI组件的及时性、灵活性以及应对性。
其中,图7至图9中所述的终端本体500,具体包括:智能手机、电子书阅读器、MP3播放器、MP4播放器、笔记本电脑、平板电脑等等。
本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括存储器、磁盘或光盘等。
以上内容仅为本发明的较佳实施例,对于本领域的普通技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,本说明书内容不应理解为对本发明的限制。