一则通过Android Canvas动态绘制图形的实例介绍
2017-12-08 14:39
851 查看
-- by Yongquan
近期开发工作中,需要实现对双摄光圈的细微调节效果,大概效果如下图,当动画比较精细时,如果使用帧动画,需要的图片资源会比较多,且调试比较麻烦。本文介绍如何通过Android Canvas的路径,把几何图形转化为程序进行动态绘制。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201712/704ea65a8bc488ad7f65107fa3603356)
首先,对图片进行分析,可以看出图形是由8块一样的扇形拼接而成,每一块图扇形是由一条垂直于y轴的直线,一个45度夹角的直线,以及一段45度的圆弧组成,如下图。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201712/5e2692d2f13752002a8cd8fd867986a7)
接着我们需要计算圆弧的起止弧度,从下图可以看出,动画的起始弧度为2度,终止弧度接近被x轴平分,取x轴上方23度,x轴下方20度,于是可以算出动画的移动弧度范围是2~67度。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201712/638b20db279960ab37cfdc6fbdb3015b)
接下来需要把该图形对应到手机坐标系上,并算出扇形的顶点a、b、c的坐标值,如下图。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201712/4be1b43238b002159c727df6d42c6cc8)
坐标(0,0)对应view的左上角,右下角的坐标是(w,h),圆心的坐标是(w/2,h/2),圆的半径r = w / 2。于是,当起始圆弧角度为alpha时,结束圆弧的角度beta = alpha + 43(360 /8 = 45,留出2度作为空白区域),此时a、c点的坐标是:
Xa = w / 2 + cos(alpha)* r
Ya = h / 2 + sin(alpha) * r
Xc = w / 2 + cos(beta)* r
Yc = h / 2 + sin(beta) * r
然后,我们需要根据2条直线的交叉点算出b点的坐标,根据上图,我们可以算出直线ab和bc的方程:
ab的方程是x = Xa,
bc的方程是x – Xc = -(y –Yc)
把x = Xa代入bc的方程,可以得到
Xb = Xa;
Yb = Xc – Xa + Yc;
算出了a、b、c的坐标,就可以用程序来绘制封闭路径,大概算法如下,
Path path = new Path();
Path.reset();
Path.arcTo(0, 0, w, h, alpha – 90, 43)
Path.lineTo(Xb,Yb)
Path.close();
最后,把得到的路径相对圆心作8次45度旋转,完成绘制。
For(i=0; i<8; i++) {
Canvas.drawPath(path, mPaint);
Canvas.rotate(45, w / 2, y / 2);
}
近期开发工作中,需要实现对双摄光圈的细微调节效果,大概效果如下图,当动画比较精细时,如果使用帧动画,需要的图片资源会比较多,且调试比较麻烦。本文介绍如何通过Android Canvas的路径,把几何图形转化为程序进行动态绘制。
首先,对图片进行分析,可以看出图形是由8块一样的扇形拼接而成,每一块图扇形是由一条垂直于y轴的直线,一个45度夹角的直线,以及一段45度的圆弧组成,如下图。
接着我们需要计算圆弧的起止弧度,从下图可以看出,动画的起始弧度为2度,终止弧度接近被x轴平分,取x轴上方23度,x轴下方20度,于是可以算出动画的移动弧度范围是2~67度。
接下来需要把该图形对应到手机坐标系上,并算出扇形的顶点a、b、c的坐标值,如下图。
坐标(0,0)对应view的左上角,右下角的坐标是(w,h),圆心的坐标是(w/2,h/2),圆的半径r = w / 2。于是,当起始圆弧角度为alpha时,结束圆弧的角度beta = alpha + 43(360 /8 = 45,留出2度作为空白区域),此时a、c点的坐标是:
Xa = w / 2 + cos(alpha)* r
Ya = h / 2 + sin(alpha) * r
Xc = w / 2 + cos(beta)* r
Yc = h / 2 + sin(beta) * r
然后,我们需要根据2条直线的交叉点算出b点的坐标,根据上图,我们可以算出直线ab和bc的方程:
ab的方程是x = Xa,
bc的方程是x – Xc = -(y –Yc)
把x = Xa代入bc的方程,可以得到
Xb = Xa;
Yb = Xc – Xa + Yc;
算出了a、b、c的坐标,就可以用程序来绘制封闭路径,大概算法如下,
Path path = new Path();
Path.reset();
Path.arcTo(0, 0, w, h, alpha – 90, 43)
Path.lineTo(Xb,Yb)
Path.close();
最后,把得到的路径相对圆心作8次45度旋转,完成绘制。
For(i=0; i<8; i++) {
Canvas.drawPath(path, mPaint);
Canvas.rotate(45, w / 2, y / 2);
}
相关文章推荐
- Android软件开发:在Canvas中利用Path绘制基本图形
- Android中使用Canvas绘制简单的图形(二) 进阶 绘制钟表
- Android画布和图形绘制---Canvas and Drawables(一)
- Android画布和图形绘制---Canvas and Drawables(二)
- 通过ArcGISforAndroid在手机地图上动态绘制椭圆
- Android画布和图形绘制---Canvas and Drawables(五)
- Android画布和图形绘制---Canvas and Drawables(三)
- Android简明开发教程八:引路蜂二维图形绘制实例功能定义
- Android画布和图形绘制---Canvas and Drawables(四)
- Android入门——利用Canvas完成绘制点、圆、直线、路径、椭圆、多边形等2D图形
- Android画布和图形绘制---Canvas and Drawables(二)
- android学习4-25 使用canvas绘制几何图形(在View内)
- Android画布和图形绘制---Canvas and Drawables(三)
- HTML5快速入门实例(一)Canvas绘制图形
- Android Canvas 图形绘制
- Android画布和图形绘制---Canvas and Drawables(五)
- android 动态绘制各种图形
- Android编程之canvas绘制各种图形(点,直线,弧,圆,椭圆,文字,矩形,多边形,曲线,圆角矩形)
- Android画布和图形绘制---Canvas and Drawables(四)
- Html5实例: <canvas>绘制渐变图形