486_带动画的饼图扇形图
来源:互联网 发布:网络视频管理系统 编辑:程序博客网 时间:2024/05/01 12:26
带动画的饼图扇形图
public class CircleView extends View {
private Context context;
private Paint paint;
private List<Double> valueList;
private List<Integer> colorList;
private List<Double> percentList = new ArrayList<>();
private List<Double> angleList = new ArrayList<>();
private float minAngle = 3f;
private float nowAngle = 360;
public void setValueAndColorArray(List<Double> valueList, List<Integer> colorList) {
if (valueList == null || colorList == null || valueList.size() != colorList.size()) {
return;
}
this.valueList = valueList;
this.colorList = colorList;
//如果有0的,就删除掉
while (isListHaveZero() != -1) {
int position = isListHaveZero();
valueList.remove(position);
colorList.remove(position);
}
//算出总数
double sum = 0;
for (double value : valueList) {
sum = sum + value;
}
//算出百分比
for (double value : valueList) {
double percent = value / sum;
percentList.add(percent);
}
//算出角度
for (double percent : percentList) {
double angle = percent * 360;
angleList.add(angle);
}
//平衡角度
while (isListHaveSmall() != -1) {
int position = isListHaveSmall();
double angle = angleList.get(position);
double chazhi = minAngle * 2 - angle;
angleList.set(position, (double) (minAngle * 2));
int maxPosition = ListUtil.getMaxPosition(angleList);
double max = angleList.get(maxPosition);
max = max - chazhi;
angleList.set(maxPosition, max);
}
}
private int isListHaveSmall() {
for (int i = 0; i < angleList.size(); i++) {
if (angleList.get(i) < minAngle * 2) {
return i;
}
}
return -1;
}
private int isListHaveZero() {
for (int i = 0; i < valueList.size(); i++) {
if (valueList.get(i) == 0) {
return i;
}
}
return -1;
}
public CircleView(Context context) {
this(context, null);
}
public CircleView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public CircleView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.context = context;
paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(dp20);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(dp200, dp200);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
RectF rectF = new RectF(dp10, dp10, dp200 - dp10, dp200 - dp10);
float alreadyAngle = 0;
if (ListUtil.isEmpty(valueList) || ListUtil.isEmpty(colorList)) {
paint.setColor(Color.parseColor("#EFEFEF"));
canvas.drawArc(rectF, 0, 360, false, paint);
} else {
for (int i = 0; i < angleList.size(); i++) {
int color = colorList.get(i);
paint.setColor(color);
double angleDouble = angleList.get(i);
float angle = (float) angleDouble;
if (i == 0) {
//第一个
if (angle - minAngle <= nowAngle) {
canvas.drawArc(rectF, 0, angle - minAngle, false, paint);
} else {
canvas.drawArc(rectF, 0, nowAngle, false, paint);
return;
}
} else if (i == angleList.size() - 1) {
//最后一个
float lastAngle = 360 - alreadyAngle;
if (alreadyAngle + lastAngle - minAngle <= nowAngle) {
canvas.drawArc(rectF, alreadyAngle, lastAngle - minAngle, false, paint);
} else {
canvas.drawArc(rectF, alreadyAngle, nowAngle - alreadyAngle - minAngle, false, paint);
return;
}
} else {
//中间的
if (alreadyAngle + angle - minAngle <= nowAngle) {
canvas.drawArc(rectF, alreadyAngle, angle - minAngle, false, paint);
} else {
canvas.drawArc(rectF, alreadyAngle, nowAngle - alreadyAngle - minAngle, false, paint);
return;
}
}
alreadyAngle = alreadyAngle + angle;
}
}
}
public void playAnimation() {
nowAngle = 0;
handler.sendEmptyMessage(0);
}
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (nowAngle < 360) {
nowAngle = nowAngle + 6;
CircleView.this.invalidate();
sendEmptyMessageDelayed(0, 5);
}
}
};
}
0 0
- 486_带动画的饼图扇形图
- android 带旋转动画的饼图
- 属性动画实现扇形圆形展开图效果
- android 自定义带动画的统计饼图
- Android自定义带动画的饼图PieChart
- php扇形图
- HTML5 画扇形图
- UIBezierPath绘制扇形图
- 占百分比,扇形图
- canvas绘画扇形图
- 扇形图-可视化数据
- ios扇形动画菜单
- 动画扇形菜单案例
- CSS3扇形动画菜单
- android,饼图,扇形图,点击,转动,随手记,可以转动的绚烂饼图
- android,饼图,扇形图,点击,转动,随手记,可以转动的绚烂饼图 .
- JavaScript ---- Canvas扇形图封装
- 使用canvas绘制扇形图
- 工作两年,终于明白了这些
- 用python做数据分析4|pandas库介绍之DataFrame基本操作
- MySQL设置锁、事务隔离级别的常用命令
- java 完全二叉树的构建与四种遍历方法
- 用jsp实现登录,登录成功则跳转到登录成功页面,失败则跳转到失败页面
- 486_带动画的饼图扇形图
- bzoj1606
- 463. Island Perimeter
- 如何使用MATLAB绘制不同类型的二维图形
- 最长上升子序列(LIS)——玲珑学院OJ 1097
- 工作1年的总结与思
- 487_动态修改的复杂进度
- 软件测试模型
- PV、UV、IP之间的区别与联系