gestureDirection = 1;
}
var _updateAngle = gestureDirection *
_angle(_updateOffset, Offset(_centerOffset.dx + 100, _centerOffset.dy), _centerOffset);
if (_updateOffset.dy < _centerOffset.dy) {
gestureDirection = -1;
} else {
gestureDirection = 1;
}
var _startAngle = gestureDirection *
_angle(_startOffset, Offset(_centerOffset.dx + 100, _centerOffset.dy), _centerOffset);
return (_updateAngle - _startAngle);
}
_angle(_aPoint, _bPoint, _oPoint) {
var _oALen = sqrt(pow(_aPoint.dx - _oPoint.dx, 2) + pow(_aPoint.dy - _oPoint.dy, 2));
var _oBLen = sqrt(pow(_bPoint.dx - _oPoint.dx, 2) + pow(_bPoint.dy - _oPoint.dy, 2));
var _aBLen = sqrt(pow(_aPoint.dx - _bPoint.dx, 2) + pow(_aPoint.dy - _bPoint.dy, 2));
var _cosAngle = (pow(_oALen, 2) + pow(_oBLen, 2) - pow(_aBLen, 2)) /
(2 * _oALen * _oBLen);
return acos(_cosAngle);
}
其中在计算的时候用到一些基本的数学函数公式,之后小菜会简单介绍一下 dart:math 函数库;计算所得的角度加在饼状图遍历绘制的扇形图角度中即可;其中注意在文字绘制时也要注意旋转坐标系角度;
if (_listData != null) {
for (int i = 0; i < _listData.length; i++) {
startAngle += sweepAngle;
sweepAngle = _listData[i].values.first * 2 * pi / _sum;
canvas.drawArc(_circle, startAngle + _rotateAngle, sweepAngle, true,
_paint…color = _subPaint(_listData[i].keys.first));
if (sweepAngle >= pi / 6) {
canvas.translate(size.width * 0.5, size.height * 0.5);
canvas.rotate(startAngle + sweepAngle * 0.5 + _rotateAngle);
Paragraph paragraph = (_pb…addText(_subName)).build()…layout(_paragraph);
canvas.drawParagraph(paragraph, Offset(50.0, 0.0 - paragraph.height * 0.5));
canvas.rotate(-startAngle - sweepAngle * 0.5 - _rotateAngle);
canvas.translate(-size.width * 0.5, -size.height * 0.5);
}
}
}
dart:math
小菜在绘制饼状图过程中需要使用三角函数等进行偏移量绘制,此时需要一些基础的数学计算;而 Dart 也有简单的 dart:math 库,主要用来数学常数和函数使用,以及随机数生成器等;
1. 常量数据
dart:math 提供了我们日常用的自然数底数 e、对数 ln 以及圆周率 pi 等,精确了很多位,避免我们自己定义;
// 自然对数的底数 e
‘e -> $e’;
// 以 e 为底 10 的对数
‘ln10 -> $ln10’;
// 以 e 为底 2 的对数
‘ln2 -> $ln2’;
// 以 2 为底 e 的对数
‘log2e -> $log2e’;
// 以 10 为底 e 的对数
‘log10e -> $log10e’;
// 圆周率
‘pi -> $pi’;
// 2 的平方根
‘sqrt2 -> $sqrt2’;
// 1/2 的平方根
‘sqrt2 -> $sqrt2’;
2. 倍数/指数函数
dart:math 提供了平方根,求幂,指数函数等便利的函数方法;
// 平方根
double sqrt(num x);
// 自然指数 e 的 x 次幂
double exp(num x);
// 自然数 x 的对数
double log(num x);
// 最小值比较
T min(T a, T b);
// 最大值比较
T max(T a, T b);
// x 的 y 次幂
num pow(num x, num exponent);
3. 三角函数
对于三角函数,提供了弧度转为角度的正弦/余弦/正切函数,同样提供了由角度值转为弧度值转换方法,需要注意例如负数、0、无穷数、无理数等特殊场景;
// 正弦函数
double sin(num radians);
// 余弦函数
double cos(num radians);
// 正切函数
double tan(num radians);
// 弧度转为正弦值
double asin(num x);
// 弧度转为余弦值
double acos(num x);
// 弧度转为正切值
double atan(num x);
ACEPieWidget 案例源码
dart:math 案例源码
总结
写到这里也结束了,在文章最后放上一个小小的福利,以下为小编自己在学习过程中整理出的一个关于Flutter的学习思路及方向,从事互联网开发,最主要的是要学好技术,而学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯,更加需要准确的学习方向达到有效的学习效果。
由于内容较多就只放上一个大概的大纲,需要更及详细的学习思维导图的 点击我的GitHub免费获取。
还有免费的高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter全方面的Android进阶实践技术资料,并且还有技术大牛一起讨论交流解决问题。
%EF%BC%81.md)免费获取。
还有免费的高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter全方面的Android进阶实践技术资料,并且还有技术大牛一起讨论交流解决问题。**