CN108845858A - 一种弧线运动的动画算法 - Google Patents
一种弧线运动的动画算法 Download PDFInfo
- Publication number
- CN108845858A CN108845858A CN201810689379.XA CN201810689379A CN108845858A CN 108845858 A CN108845858 A CN 108845858A CN 201810689379 A CN201810689379 A CN 201810689379A CN 108845858 A CN108845858 A CN 108845858A
- Authority
- CN
- China
- Prior art keywords
- canvas
- parameter
- mpaint
- curve
- circular arc
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/451—Execution arrangements for user interfaces
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Human Computer Interaction (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Processing Or Creating Images (AREA)
Abstract
本发明涉及一种弧线运动的动画算法,包括如下步骤:创建画布Canvas,供用户在上面进行绘制,在onDraw回调中,canvas.save()获取canvas保存的状态,以画布中心为中心进行画布旋转,创建一个新的绘制区域arcBounds做为缓存,并设置内边距mStrokeInset,设置每次绘制时画笔mPaint的宽度和颜色,开始画圆弧canvas.drawArc,最后再恢复到canvas最初的状态canvas.restoreToCount(saveCount)。本发明,自定义控件,实现圆弧摆动的效果,模拟能量守恒球不断碰撞的动画效果,呈现全新的加载动画页面,凸显个性化及App,具一定扩展性,可修改制作其他样式的加载动画效果,提高开发效率。
Description
技术领域
本发明涉及应用的加载动画技术领域,具体说是一种弧线运动的动画算法。
背景技术
现有的应用程序(例如App),在打开运行时,总会看到一个加载动画页面,以便在等待加载的过程中,用户可以知晓应用程序正在工作、加载的进度等信息。
常见的加载动画页面,有的是呈现一张静态图片,有的是呈现一组图片实现动画效果,有的是呈现一段短视频实现动画效果,为了凸显个性化,丰富加载动画页面的功能及动画效果,有必要对加载动画页面进行优化、再设计。
根据公司目前的开发计划,拟实现一种模拟能量守恒双摆球的动画效果,该动画效果作为新版App的加载动画页面。所述模拟能量守恒双摆球动画效果中,包括沿水平方向依次排列的多颗小球(通常是奇数个),这些小球中,最左侧和最右侧的小球交替的被弹出并回落,小球的移动轨迹为弧线,且移动速度不恒定,故需要专门设计相应的轨迹移动算法。
发明内容
针对现有技术中存在的缺陷,本发明的目的在于提供一种弧线运动的动画算法,自定义控件,实现圆弧摆动的效果,模拟能量守恒球不断碰撞的动画效果,呈现全新的加载动画页面,凸显个性化及App,具一定扩展性,可修改制作其他样式的加载动画效果,提高开发效率。
为达到以上目的,本发明采取的技术方案是:
一种弧线运动的动画算法,其特征在于,包括如下步骤:
创建画布Canvas,Canvas由android系统提供,供用户在上面进行绘制,
在onDraw回调中,canvas.save()获取canvas保存的状态,
以画布中心为中心进行画布旋转,
创建一个新的绘制区域arcBounds做为缓存,并设置内边距mStrokeInset,
设置每次绘制时画笔mPaint的宽度mPaint.setStrokeWidth和颜色mPaint.setColor,
开始画圆弧canvas.drawArc,drawArc获取以下参数信息:
第一个参数为圆弧的形状和大小的范围,
第二个参数是设置圆弧是从哪个角度来绘画的,
第三个参数是设置圆弧扫过的角度,
第四个参数是设置圆弧在绘画的时候是否经过圆形,
第五个参数是定义的画笔mPaint,
最后再恢复到canvas最初的状态canvas.restoreToCount(saveCount)。
在上述技术方案的基础上,画布旋转角度mGroupRotation的计算方法如下:
mGroupRotation = ((FULL_GROUP_ROTATION / NUM_POINTS) * renderProgress) +(FULL_GROUP_ROTATION * (mRotationCount / NUM_POINTS));
其中:
FULL_GROUP_ROTATION是一次循环的角度,
NUM_POINTS是循环总次数,
renderProgress是当前变化的进度,
mRotationCount是当前循环位置。
在上述技术方案的基础上,设置每次绘制时画笔mPaint的宽度mPaint.setStrokeWidth时,调用getStrokeWidth()计算特定屏幕下画线的宽度,具体计算方式为:
特定屏幕下画线的宽度等于设置的默认画线宽度*屏幕分辨率screenDensity。
在上述技术方案的基础上,所述第一个参数,由createArcBounds(arcBounds, i)计算得出,确定圆弧的形状和大小范围,需要针对每个线确定下一个画布区域,创建临时的绘制区域arcBounds,其中intervalWidth += getStrokeWidth() / (i + 1.0f) * 1.5f两条线间区域差为上一个线宽度的1.5倍,再根据上一个绘制区域的位置和两条线间的区域就确定了新区域arcBounds的范围。
在上述技术方案的基础上,所述第二个参数,起点角度是mStartDegrees,分别加上180和360表示向左上方和右上方绘制。
在上述技术方案的基础上,所述第三个参数,代表扫过的角度,等于终点角度减去起点角度,即:mSwipeDegrees = mEndDegrees – mStartDegrees。
本发明所述的弧线运动的动画算法,自定义控件,实现圆弧摆动的效果,模拟能量守恒球不断碰撞的动画效果,呈现全新的加载动画页面,凸显个性化及App,具一定扩展性,可修改制作其他样式的加载动画效果,提高开发效率。
附图说明
本发明有如下附图:
图1本发明的流程图。
具体实施方式
以下结合附图对本发明作进一步详细说明。
如图1所示,本发明所述的弧线运动的动画算法,包括如下步骤:
创建画布Canvas,Canvas由android系统提供,供用户在上面进行绘制,
在onDraw回调中,canvas.save()获取canvas保存的状态,
以画布中心为中心进行画布旋转,
canvas.rotate(mGroupRotation,bounds.exactCenterX(),bounds.exactCenterY()),
其中:
mGroupRotation为画布旋转角度,
bounds.exactCenterX(),bounds.exactCenterY()为画布中心坐标,
创建一个新的绘制区域arcBounds做为缓存,并设置内边距mStrokeInset,
设置每次绘制时画笔mPaint的宽度mPaint.setStrokeWidth和颜色mPaint.setColor,
开始画圆弧canvas.drawArc,drawArc获取以下参数信息:
第一个参数为圆弧的形状和大小的范围,
第二个参数是设置圆弧是从哪个角度来绘画的,
第三个参数是设置圆弧扫过的角度,
第四个参数是设置圆弧在绘画的时候是否经过圆形,
第五个参数是定义的画笔mPaint,
最后再恢复到canvas最初的状态canvas.restoreToCount(saveCount)。
在上述技术方案的基础上,画布旋转角度mGroupRotation的计算方法如下:
mGroupRotation = ((FULL_GROUP_ROTATION / NUM_POINTS) * renderProgress) +(FULL_GROUP_ROTATION * (mRotationCount / NUM_POINTS));
其中:
FULL_GROUP_ROTATION是一次循环的角度,
NUM_POINTS是循环总次数,
renderProgress是当前变化的进度,
mRotationCount是当前循环位置。
在上述技术方案的基础上,设置每次绘制时画笔mPaint的宽度mPaint.setStrokeWidth时,调用getStrokeWidth()计算特定屏幕下画线的宽度,具体计算方式为:
特定屏幕下画线的宽度等于设置的默认画线宽度*屏幕分辨率screenDensity。
例如,可采用如下代码:
for (int i = 0; i < mColors.length; i++) {
mPaint.setStrokeWidth(getStrokeWidth() / (i + 1));
mPaint.setColor(mColors[i]);
canvas.drawArc(createArcBounds(arcBounds, i), mStartDegrees +DEGREE_180 * (i % 2), mSwipeDegrees, false, mPaint);
},
其中:
mColors为默认的颜色值,mColors=DEFAULT_COLORS。
DEFAULT_COLORS中定义了三种颜色 DEFAULT_COLORS = new int[]{Color.RED,Color.GREEN, Color.BLUE}。
canvas.drawArc涉及的参数如前所述,
第一个参数为圆弧的形状和大小的范围,由createArcBounds(arcBounds, i)计算得出,具体算法如下:
private RectF createArcBounds(RectF sourceArcBounds, int index) {
RectF arcBounds = new RectF();
int intervalWidth = 0;
for (int i = 0; i < index; i++) {
intervalWidth += getStrokeWidth() / (i + 1.0f) * 1.5f;
}
int arcBoundsLeft = (int) (sourceArcBounds.left + intervalWidth);
int arcBoundsTop = (int) (sourceArcBounds.top + intervalWidth);
int arcBoundsRight = (int) (sourceArcBounds.right -intervalWidth);
int arcBoundsBottom = (int) (sourceArcBounds.bottom -intervalWidth);
arcBounds.set(arcBoundsLeft, arcBoundsTop, arcBoundsRight,arcBoundsBottom);
return arcBounds;
}
其中:确定圆弧的形状和大小范围,需要针对每个线确定下一个画布区域,创建临时的绘制区域arcBounds,其中intervalWidth += getStrokeWidth() / (i + 1.0f) * 1.5f两条线间区域差为上一个线宽度的1.5倍,再根据上一个绘制区域的位置和两条线间的区域就确定了新区域arcBounds的范围,
第二个参数是设置圆弧是从哪个角度来绘画的,起点角度是mStartDegrees,分别加上180和360表示向左上方和右上方绘制,
第三个参数是设置圆弧扫过的角度,mSwipeDegrees代表扫过的角度,等于终点角度减去起点角度,即:mSwipeDegrees = mEndDegrees – mStartDegrees,
第四个参数是设置圆弧在绘画的时候是否经过圆形,
第五个参数是定义的画笔mPaint。
本说明书中未作详细描述的内容属于本领域专业技术人员公知的现有技术。
Claims (6)
1.一种弧线运动的动画算法,其特征在于,包括如下步骤:
创建画布Canvas,Canvas由android系统提供,供用户在上面进行绘制,
在onDraw回调中,canvas.save()获取canvas保存的状态,
以画布中心为中心进行画布旋转,
创建一个新的绘制区域arcBounds做为缓存,并设置内边距mStrokeInset,
设置每次绘制时画笔mPaint的宽度mPaint.setStrokeWidth和颜色mPaint.setColor,
开始画圆弧canvas.drawArc,drawArc获取以下参数信息:
第一个参数为圆弧的形状和大小的范围,
第二个参数是设置圆弧是从哪个角度来绘画的,
第三个参数是设置圆弧扫过的角度,
第四个参数是设置圆弧在绘画的时候是否经过圆形,
第五个参数是定义的画笔mPaint,
最后再恢复到canvas最初的状态canvas.restoreToCount(saveCount)。
2.如权利要求1所述的弧线运动的动画算法,其特征在于:画布旋转角度mGroupRotation的计算方法如下:
mGroupRotation = ((FULL_GROUP_ROTATION / NUM_POINTS) * renderProgress) +(FULL_GROUP_ROTATION * (mRotationCount / NUM_POINTS));
其中:
FULL_GROUP_ROTATION是一次循环的角度,
NUM_POINTS是循环总次数,
renderProgress是当前变化的进度,
mRotationCount是当前循环位置。
3.如权利要求1所述的弧线运动的动画算法,其特征在于:设置每次绘制时画笔mPaint的宽度mPaint.setStrokeWidth时,调用getStrokeWidth()计算特定屏幕下画线的宽度,具体计算方式为:
特定屏幕下画线的宽度等于设置的默认画线宽度*屏幕分辨率screenDensity。
4.如权利要求1所述的弧线运动的动画算法,其特征在于:所述第一个参数,由createArcBounds(arcBounds, i)计算得出,确定圆弧的形状和大小范围,需要针对每个线确定下一个画布区域,创建临时的绘制区域arcBounds,其中intervalWidth +=getStrokeWidth() / (i + 1.0f) * 1.5f两条线间区域差为上一个线宽度的1.5倍,再根据上一个绘制区域的位置和两条线间的区域就确定了新区域arcBounds的范围。
5.如权利要求1所述的弧线运动的动画算法,其特征在于:所述第二个参数,起点角度是mStartDegrees,分别加上180和360表示向左上方和右上方绘制。
6.如权利要求1所述的弧线运动的动画算法,其特征在于:所述第三个参数,代表扫过的角度,等于终点角度减去起点角度,即:mSwipeDegrees = mEndDegrees –mStartDegrees。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810689379.XA CN108845858A (zh) | 2018-06-28 | 2018-06-28 | 一种弧线运动的动画算法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810689379.XA CN108845858A (zh) | 2018-06-28 | 2018-06-28 | 一种弧线运动的动画算法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN108845858A true CN108845858A (zh) | 2018-11-20 |
Family
ID=64200635
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810689379.XA Pending CN108845858A (zh) | 2018-06-28 | 2018-06-28 | 一种弧线运动的动画算法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108845858A (zh) |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106569834A (zh) * | 2016-11-14 | 2017-04-19 | 福建天泉教育科技有限公司 | 基于浏览器的动画制作方法及系统 |
CN107346250A (zh) * | 2017-07-16 | 2017-11-14 | 北京酷我科技有限公司 | 一种呼吸灯效果的进度条的层叠显示算法 |
-
2018
- 2018-06-28 CN CN201810689379.XA patent/CN108845858A/zh active Pending
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106569834A (zh) * | 2016-11-14 | 2017-04-19 | 福建天泉教育科技有限公司 | 基于浏览器的动画制作方法及系统 |
CN107346250A (zh) * | 2017-07-16 | 2017-11-14 | 北京酷我科技有限公司 | 一种呼吸灯效果的进度条的层叠显示算法 |
Non-Patent Citations (2)
Title |
---|
FENGCHONG1990: ""Android酷炫的加载动画"", 《HTTPS://BLOG.CSDN.NET/FENGCHONG1990/ARTICLE/DETAILS/51346310》 * |
尹凯文: ""Android实现左右摆动的球体动画效果"", 《HTTPS://WWW.JB51.NET/ARTICLE/92029.HTM》 * |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN105233498B (zh) | 游戏角色染色方法、装置、用户终端及游戏系统 | |
CN107346250B (zh) | 一种呼吸灯效果的进度条的层叠显示方法 | |
CN101365117B (zh) | 一种自定义分屏模式的方法 | |
CN110333924A (zh) | 一种图像渐变调整方法、装置、设备及存储介质 | |
CN101963894A (zh) | 终端中显示桌面的墙纸的方法和装置 | |
CA2943108C (en) | Image compositing device based on mask image, image compositing method and medium therefor | |
CN107958449A (zh) | 一种图像合成方法及装置 | |
CN103035024A (zh) | 一种基于三维虚拟平台的实体材质置换方法 | |
CN109118556B (zh) | 一种实现ui界面动画过渡效果的方法、系统及存储介质 | |
CN110930486A (zh) | 一种游戏中虚拟草丛的渲染方法、装置及电子设备 | |
CN108399646B (zh) | 一种图像渲染方法及装置 | |
CN108132765A (zh) | 一种移动终端的切换显示方法及移动终端 | |
CN102722902B (zh) | 一种图形渲染流水线中光栅化阶段反走样的改进方法 | |
CN108845858A (zh) | 一种弧线运动的动画算法 | |
CN101673409B (zh) | 一种应用于计算机桌面的图像渲染方法 | |
WO2009018033A1 (en) | Method and apparatus for graphically defining surface normal maps | |
JP2012104099A5 (zh) | ||
CN108829489A (zh) | 一种弧线变速运动的动画算法 | |
CN102254337A (zh) | 一种2d动画贴图的换色方法 | |
CN104318509B (zh) | 一种基于gpu的大批量目标高速标绘方法 | |
CN113096592B (zh) | 一种消除显示屏残影的方法、设备及显示设备 | |
CN106528161A (zh) | 终端设备、页面显示处理装置及方法 | |
CN103399767A (zh) | 一种界面换肤方法及装置 | |
CN108874385A (zh) | 一种能量守恒双摆球的动画效果算法 | |
CN102073468A (zh) | 一种基于视窗系统实现图像边缘融合方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |