本发明涉及应用的加载动画技术领域,具体说是一种弧线变速运动的变速值的生成算法。
背景技术:
现有的应用程序(例如App),在打开运行时,总会看到一个加载动画页面,以便在等待加载的过程中,用户可以知晓应用程序正在工作、加载的进度等信息。
常见的加载动画页面,有的是呈现一张静态图片,有的是呈现一组图片实现动画效果,有的是呈现一段短视频实现动画效果,为了凸显个性化,丰富加载动画页面的功能及动画效果,有必要对加载动画页面进行优化、再设计。
根据公司目前的开发计划,拟实现一种模拟能量守恒双摆球的动画效果,该动画效果作为新版App的加载动画页面。所述模拟能量守恒双摆球动画效果中,包括沿水平方向依次排列的多颗小球(通常是奇数个),这些小球中,最左侧和最右侧的小球交替的被弹出并回落,小球的移动轨迹为弧线,且移动速度不恒定,故需要专门设计相应的轨迹移动算法。
在算法设计中,由于小球的移动轨迹为弧线,且移动速度不恒定,因此,如何提供相应的控制值(变速值)实现对小球轨迹的移动速度控制,是关键算法之一。
技术实现要素:
针对现有技术中存在的缺陷,本发明的目的在于提供一种弧线变速运动的变速值的生成算法,通过FastOutSlowInInterpolator产生变速值,作为interpolator插补器的属性,在使用动画Animation或者AnimationSet的时候,使用这个属性来修饰动画运动的速率,实现了弧线变速运动的变速值的生成及控制,算法简洁,易于使用,提高开发效率。
为达到以上目的,本发明采取的技术方案是:
一种弧线变速运动的变速值的生成算法,其特征在于,包括如下步骤:
通过FastOutSlowInInterpolator产生变速值,所述FastOutSlowInInterpolator指贝塞尔曲线的插补器FastOutSlowInInterpolator(),运动规律是由慢到快再到慢,
将变速值赋值给MATERIAL_INTERPOLATOR,作为interpolator插补器的属性,限定MATERIAL_INTERPOLATOR为private static final Interpolator,
在使用动画Animation或者AnimationSet的时候,使用这个属性来修饰动画运动的速率,实现了弧线变速运动的变速值的生成及控制,
在FastOutSlowInInterpolator产生中调用computeRender方法,
通过计算终点角度mEndDegrees 和起点角度mStartDegrees的差值,来得出旋转的角度mSwipeDegrees,也就是变化的角度,
计算时,判断Math.abs(mEndDegrees - mStartDegrees) > 0是否成立,成立则mSwipeDegrees = mEndDegrees – mStartDegrees,
设mRotationIncrement是新的旋转角度增量,mOriginRotationIncrement是上一次循环角度增量,MAX_ROTATION_INCREMENT是每次旋转最大增加角度值,则:
mRotationIncrement = mOriginRotationIncrement + (MAX_ROTATION_INCREMENT * renderProgress),
即:新的旋转角度增量=上一次循环角度增量+(每次旋转最大增加角度值*当前变化的进度),
计算画布旋转角度:((一次循环的角度/循环总次数)*当前变化的进度)+(一次循环的角度*(当前循环位置/循环总次数))。
在上述技术方案的基础上,终点角度mEndDegrees 和起点角度mStartDegrees通过以下步骤计算:
判断当前变化的进度renderProgress小于等于起点绘制结束时进度START_TRIM_DURATION_OFFSET,则:
起点移动进度startTrimProgress赋值为(renderProgress) / (1.0f - START_TRIM_DURATION_OFFSET),
即:判断当目前变化进度小于起点结束进度时,起点移动进度=当前变化进度/起点变化进度,
起点应该移动后的新角度mStartDegrees赋值为mOriginStartDegrees+MAX_SWIPE_DEGREES*MATERIAL_INTERPOLATOR.getInterpolation(startTrimProgress),
即:起点应该移动后的新角度=原角度 + 一次绘制角度*转换后起点应该移动的进度,
原角度mOriginStartDegrees即指初始角度,
一次绘制角度MAX_SWIPE_DEGREES即指单次绘制画弧所占最大角度,
判断当前变化的进度renderProgress大于起点绘制结束时进度START_TRIM_DURATION_OFFSET,则:
终点移动进度endTrimProgress赋值为(renderProgress-START_TRIM_DURATION_OFFSET) / (END_TRIM_DURATION_OFFSET - START_TRIM_DURATION_OFFSET),
即:判断当目前变化进度大于起点结束进度时,终点移动进度=(当前变化进度-起点绘制结束时进度)/(终点绘制结束时进度-起点绘制结束时进度),
终点应该移动后的新角度mEndDegrees赋值为mOriginEndDegrees+MAX_SWIPE_DEGREES* MATERIAL_INTERPOLATOR.getInterpolation(endTrimProgress),
即:终点应该移动后的新角度=原角度 + 一次绘制角度* 转换后终点应该移动的进度。
在上述技术方案的基础上,调用插补器通过如下方式:
创建动画监听器mAnimatorListener,设置动画开始时的操作和动画过程中的操作,
动画过程中的的时候,onAnimationRepeat方法会在动画在重复播放的时候被回调,storeOriginals()保存上一次绘制位置,mStartDegrees = mEndDegrees,设置下一次起点为上一次的终点;mRotationCount = (mRotationCount + 1) % (NUM_POINTS)重新设置当前循环位置,NUM_POINTS是循环总次数,
动画开始的时候,mRotationCount=0,把当前循环位置置为0。
在上述技术方案的基础上,使用时,把创建的监听器mAnimatorListener设置给mRenderAnimator,这是android系统提供的一种属性动画,用来控制控件的动画。
在上述技术方案的基础上,默认MAX_SWIPE_DEGREES取值为0.6f * DEGREE_360,
DEGREE_360 = 360作为初始旋转角度,表示向右上方绘制。
在上述技术方案的基础上,默认起点绘制结束时进度START_TRIM_DURATION_OFFSET = 0.5f,
默认终点绘制结束时进度END_TRIM_DURATION_OFFSET = 1.0f。
在上述技术方案的基础上,重新进入该页面的时候再恢复到初始位置,把上一次终点角度mOriginEndDegrees置为0,上一次起点角度mOriginStartDegrees置为0,上一次的旋转角度mOriginRotationIncrement置为0,终点角度mEndDegrees置为0,起点角度置为0,最新的旋转角度mRotationIncrement置为0,把圆弧扫过的角度mSwipeDegrees置为初始值。
本发明所述的弧线变速运动的变速值的生成算法,通过FastOutSlowInInterpolator产生变速值,作为interpolator插补器的属性,在使用动画Animation或者AnimationSet的时候,使用这个属性来修饰动画运动的速率,实现了弧线变速运动的变速值的生成及控制,算法简洁,易于使用,提高开发效率。
附图说明
本发明有如下附图:
图1本发明的流程图。
具体实施方式
以下结合附图对本发明作进一步详细说明。
如图1所示,本发明所述的弧线变速运动的变速值的生成算法,包括如下步骤:
通过FastOutSlowInInterpolator产生变速值,所述FastOutSlowInInterpolator指贝塞尔曲线的插补器FastOutSlowInInterpolator(),运动规律是由慢到快再到慢,
将变速值赋值给MATERIAL_INTERPOLATOR,作为interpolator插补器的属性,限定MATERIAL_INTERPOLATOR为private static final Interpolator,
在使用动画Animation或者AnimationSet的时候,使用这个属性来修饰动画运动的速率,实现了弧线变速运动的变速值的生成及控制,
在FastOutSlowInInterpolator产生中调用computeRender方法,
通过计算终点角度mEndDegrees 和起点角度mStartDegrees的差值,来得出旋转的角度mSwipeDegrees,也就是变化的角度,
计算时,判断Math.abs(mEndDegrees - mStartDegrees) > 0是否成立,成立则mSwipeDegrees = mEndDegrees – mStartDegrees,
设mRotationIncrement是新的旋转角度增量,mOriginRotationIncrement是上一次循环角度增量,MAX_ROTATION_INCREMENT是每次旋转最大增加角度值,则:
mRotationIncrement = mOriginRotationIncrement + (MAX_ROTATION_INCREMENT * renderProgress),
即:新的旋转角度增量=上一次循环角度增量+(每次旋转最大增加角度值*当前变化的进度),
计算画布旋转角度:((一次循环的角度/循环总次数)*当前变化的进度)+(一次循环的角度*(当前循环位置/循环总次数))。
在上述技术方案的基础上,终点角度mEndDegrees 和起点角度mStartDegrees通过以下步骤计算:
判断当前变化的进度renderProgress小于等于起点绘制结束时进度START_TRIM_DURATION_OFFSET,则:
起点移动进度startTrimProgress赋值为(renderProgress) / (1.0f - START_TRIM_DURATION_OFFSET),
即:判断当目前变化进度小于起点结束进度时,起点移动进度=当前变化进度/起点变化进度,
起点应该移动后的新角度mStartDegrees赋值为mOriginStartDegrees+MAX_SWIPE_DEGREES*MATERIAL_INTERPOLATOR.getInterpolation(startTrimProgress),
即:起点应该移动后的新角度=原角度 + 一次绘制角度*转换后起点应该移动的进度,
原角度mOriginStartDegrees即指初始角度,
一次绘制角度MAX_SWIPE_DEGREES即指单次绘制画弧所占最大角度,
判断当前变化的进度renderProgress大于起点绘制结束时进度START_TRIM_DURATION_OFFSET,则:
终点移动进度endTrimProgress赋值为(renderProgress-START_TRIM_DURATION_OFFSET) / (END_TRIM_DURATION_OFFSET - START_TRIM_DURATION_OFFSET),
即:判断当目前变化进度大于起点结束进度时,终点移动进度=(当前变化进度-起点绘制结束时进度)/(终点绘制结束时进度-起点绘制结束时进度),
终点应该移动后的新角度mEndDegrees赋值为mOriginEndDegrees+MAX_SWIPE_DEGREES* MATERIAL_INTERPOLATOR.getInterpolation(endTrimProgress),
即:终点应该移动后的新角度=原角度 + 一次绘制角度* 转换后终点应该移动的进度。
在上述技术方案的基础上,调用插补器通过如下方式:
创建动画监听器mAnimatorListener,设置动画开始时的操作和动画过程中的操作,
创建动画监听器mAnimatorListener,
代码如下:
private final Animator.AnimatorListener mAnimatorListener = new AnimatorListenerAdapter() {
动画过程中的的时候,onAnimationRepeat方法会在动画在重复播放的时候被回调,storeOriginals()保存上一次绘制位置,mStartDegrees = mEndDegrees,设置下一次起点为上一次的终点;mRotationCount = (mRotationCount + 1) % (NUM_POINTS)重新设置当前循环位置,NUM_POINTS是循环总次数,
代码如下:
@Override
public void onAnimationRepeat(Animator animator) {
super.onAnimationRepeat(animator);
storeOriginals();
mStartDegrees = mEndDegrees;
mRotationCount = (mRotationCount + 1) % (NUM_POINTS);
}
动画开始的时候,mRotationCount=0,把当前循环位置置为0;
代码如下:
@Override
public void onAnimationStart(Animator animation) {
super.onAnimationStart(animation);
mRotationCount = 0;
}
}。
使用时,把创建的监听器mAnimatorListener设置给mRenderAnimator,这是android系统提供的一种属性动画,用来控制控件的动画。
在上述技术方案的基础上,默认MAX_SWIPE_DEGREES取值为0.6f * DEGREE_360,
DEGREE_360 = 360作为初始旋转角度,表示向右上方绘制。
更进一步,默认单次绘制画弧所占最小角度MIN_SWIPE_DEGREE = 0.1f。
在上述技术方案的基础上,默认起点绘制结束时进度START_TRIM_DURATION_OFFSET = 0.5f,
默认终点绘制结束时进度END_TRIM_DURATION_OFFSET = 1.0f。
在上述技术方案的基础上,重新进入该页面的时候再恢复到初始位置,把上一次终点角度mOriginEndDegrees置为0,上一次起点角度mOriginStartDegrees置为0,上一次的旋转角度mOriginRotationIncrement置为0,终点角度mEndDegrees置为0,起点角度置为0,最新的旋转角度mRotationIncrement置为0,把圆弧扫过的角度mSwipeDegrees置为初始值。
本说明书中未作详细描述的内容属于本领域专业技术人员公知的现有技术。