文档章节

android图表类

席道坤
 席道坤
发布于 2017/05/08 19:05
字数 754
阅读 86
收藏 0
点赞 0
评论 0

一 开源库MPChart

github开源地址:https://github.com/PhilJay/MPAndroidChart

gradle配置:

项目级build.gradle配置:

allprojects {
    repositories {
        maven { url "https://jitpack.io" }
    }
}

工程级build.gradle配置:

compile 'com.github.PhilJay:MPAndroidChart:v3.0.2'

 

二 自定义饼形图

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;

import com.base.library.R;

/**
 * @author:cary
 * @date:2017/5/2
 * @descript:饼形图
 */
public class PieChartWidget extends View {

    private Context mContext;

    private float mParentingPre;//亲子所占百分比
    private float mRestaurantPre;//餐饮
    private float mRetailPre;//零售
    private float mEntertainmentPre;//娱乐
    private float mSportsPre;//运动

    private int mParentingColor;//绘制颜色
    private int mRestaurantColor;
    private int mRetailColor;
    private int mEntertainmentColor;
    private int mSportsColor;

    private Paint mArcPaint;//圆弧画笔
    private Paint mLinePaint;//画折线画笔

    private float mCenterX;
    private float mCenterY;
    private float mRadius;//半径
    private float mStorkeWidth;
    private float mLineWidth;

    public PieChartWidget(Context context) {
        super(context);
    }

    public PieChartWidget(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init(context, attrs);
    }

    public PieChartWidget(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context, attrs);
    }

    private void init(Context context, @Nullable AttributeSet attrs){
        this.mContext = context;

        TypedArray mTypedArray = context.obtainStyledAttributes(attrs, R.styleable.PieChart);
        mParentingPre = mTypedArray.getFloat(R.styleable.PieChart_parentingPre ,0)/100f * 360f;
        mRestaurantPre = mTypedArray.getFloat(R.styleable.PieChart_restaurantPre ,0)/100f * 360f;
        mRetailPre = mTypedArray.getFloat(R.styleable.PieChart_retailPre ,0)/100f * 360f;
        mEntertainmentPre = mTypedArray.getFloat(R.styleable.PieChart_entertainmentPre ,0)/100f *360f;
        mSportsPre = mTypedArray.getFloat(R.styleable.PieChart_sportsPre ,0)/100f * 360f;

        mParentingColor = mTypedArray.getColor(R.styleable.PieChart_parentingColor, Color.WHITE );
        mRestaurantColor = mTypedArray.getColor(R.styleable.PieChart_restaurantColor, Color.WHITE );
        mRetailColor = mTypedArray.getColor(R.styleable.PieChart_retailColor, Color.WHITE );
        mEntertainmentColor = mTypedArray.getColor(R.styleable.PieChart_entertainmentColor, Color.WHITE );
        mSportsColor = mTypedArray.getColor(R.styleable.PieChart_sportsColor, Color.WHITE );

        mRadius = mTypedArray.getDimension(R.styleable.PieChart_radius ,0);
        mStorkeWidth = mTypedArray.getDimension(R.styleable.PieChart_arcStrokeWidth ,0);
        mLineWidth = mTypedArray.getDimension(R.styleable.PieChart_lineStrokeWidth ,0);

        mArcPaint = new Paint();
        mArcPaint.setAntiAlias(true);
        mArcPaint.setDither(true);
        mArcPaint.setStyle(Paint.Style.STROKE);
        mArcPaint.setStrokeWidth(mStorkeWidth);

        mLinePaint = new Paint();
        mLinePaint.setAntiAlias(true);
        mLinePaint.setDither(true);
        mLinePaint.setStyle(Paint.Style.STROKE);
        mLinePaint.setStrokeWidth(mLineWidth);

        mTypedArray.recycle();
        postInvalidate();
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.getSize(heightMeasureSpec));
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        mCenterX = w/2;
        mCenterY = h/2;
    }

    /**
     * 设置亲子百分比
     * @param present
     */
    public void setParentingPre(float present){
        this.mParentingPre = 360f * (present/100f);
    }

    public void setRestaurantPre(float present){
        this.mRestaurantPre = 360f * (present/100f);
    }

    public void setRetailPre(float present){
        this.mRetailPre = 360f * (present/100f);
    }

    public void setEntertainmentPre(float present){
        this.mEntertainmentPre = 360f * (present/100f);
    }

    public void setSportsPre(float present){
        this.mSportsPre = 360f * (present/100f);
    }

    /**
     * 设置宽度
     * @param width
     */
    public void setStrokeWidth(int width){
        mArcPaint.setStrokeWidth(width);
    }

    /**
     * 半径
     * @param radius
     */
    public void setRadius(float radius){
        mRadius = radius;
    }


    /**
     * 设置亲子色值
     * @param color
     */
    public void setParentingColor(int color){
        this.mParentingColor = color;
    }

    public void setRestaurantColor(int color){
        this.mRestaurantColor = color;
    }

    public void setRetailColor(int color){
        this.mRetailColor = color;
    }

    public void setEntertainmentColor(int color){
        this.mEntertainmentColor = color;
    }

    public void setSportsColor(int color){
        this.mSportsColor = color;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        RectF mRectF = new RectF(mCenterX - mRadius, mCenterY - mRadius, mCenterX + mRadius, mCenterY + mRadius);

        //绘制亲子
        mArcPaint.setColor(mParentingColor);
        mLinePaint.setColor(mParentingColor);
        canvas.drawArc(mRectF, -90f, -mParentingPre, false, mArcPaint);
        drawLines(canvas, -60f-mParentingPre, mLinePaint);

        //绘制餐饮
        mArcPaint.setColor(mRestaurantColor);
        mLinePaint.setColor(mRestaurantColor);
        canvas.drawArc(mRectF, -90f-mParentingPre, -mRestaurantPre, false, mArcPaint);
        drawLines(canvas, -60f-mParentingPre-mRestaurantPre, mLinePaint);

        //绘制零售
        mArcPaint.setColor(mRetailColor);
        mLinePaint.setColor(mRetailColor);
        canvas.drawArc(mRectF, -90f-mParentingPre-mRestaurantPre, -mRetailPre, false, mArcPaint);
        drawLines(canvas, -60f-mParentingPre-mRestaurantPre-mRetailPre, mLinePaint);

        //娱乐
        mArcPaint.setColor(mEntertainmentColor);
        mLinePaint.setColor(mEntertainmentColor);
        canvas.drawArc(mRectF, -90f-mParentingPre-mRestaurantPre-mRetailPre, -mEntertainmentPre, false, mArcPaint);
        drawLines(canvas, -60f-mParentingPre-mRestaurantPre-mRetailPre-mEntertainmentPre, mLinePaint);

        //运动
        mArcPaint.setColor(mSportsColor);
        mLinePaint.setColor(mSportsColor);
        canvas.drawArc(mRectF, -90f-mParentingPre-mRestaurantPre-mRetailPre-mEntertainmentPre, -mSportsPre, false, mArcPaint);
        drawLines(canvas, -60f-mParentingPre-mRestaurantPre-mRetailPre-mEntertainmentPre-mSportsPre, mLinePaint);

    }

    private void drawLines(Canvas canvas, float angle, Paint paint){

        float absAngle = Math.abs(angle + 90);//取绝对值

        float x1 = (float) (mCenterX-(mRadius+mArcPaint.getStrokeWidth()/2)*Math.sin(Math.toRadians(absAngle)));
        float y1 =(float) (mCenterY- (mRadius+mArcPaint.getStrokeWidth()/2)*Math.cos(Math.toRadians(absAngle)));
        float x2 = (float) (x1 - 80*Math.sin(Math.toRadians(absAngle)));
        float y2 = (float) (y1 - 80*Math.cos(Math.toRadians(absAngle)));

        if(absAngle < 90){
            canvas.drawLine(x1, y1, x2, y2, paint);
            canvas.drawLine(x2, y2, x2-80, y2, paint);//x值增加
        } else if(absAngle == 90){
            canvas.drawLine(x1, y1, x1-80, y1, paint);
        } else if(absAngle>90 && absAngle<180){
            canvas.drawLine(x1, y1, x2, y2, paint);
            canvas.drawLine(x2, y2, x2-80, y2, paint);
        } else if(absAngle == 180){
            canvas.drawLine(x1, y1, x1, y1+80, paint);
        } else if(absAngle>180 && absAngle<270){
            canvas.drawLine(x1, y1, x2, y2, paint);
            canvas.drawLine(x2, y2, x2+80, y2, paint);//x值增加
        } else if(absAngle == 270){
            canvas.drawLine(x1, y1, x1+80, y1, paint);
        } else if(absAngle>270 && absAngle<360){
            canvas.drawLine(x1, y1, x2, y2, paint);
            canvas.drawLine(x2, y2, x2+80, y2, paint);//x值增加
        } else if(absAngle == 360){
            canvas.drawLine(x1, y1, x1, y1-80, paint);
        }
    }

}

© 著作权归作者所有

共有 人打赏支持
席道坤
粉丝 12
博文 219
码字总数 167769
作品 0
徐汇
程序员
Android组件及UI框架大全

Android 是目前最流行的移动操作系统(还需要加之一吗?)。 随着新版本的不断发布, Android的功能也日益强大, 涌现了很多流行的应用程序, 也催生了一大批的优秀的组件。 本文试图将目前流行...

千山万水
2015/07/13
0
4
Android组件及UI框架大全

Android 是目前最流行的移动操作系统(还需要加之一吗?)。 随着新版本的不断发布, Android的功能也日益强大, 涌现了很多流行的应用程序, 也催生了一大批的优秀的组件。 本文试图将目前流行...

千山万水
2015/07/13
0
0
支持常用的图表、仪表和地图类型的图表控件TeeChart Java for Android

TeeChart Java for Android控件是针对Google的Android操作系统设计的图表控件,支持常用的图表、仪表和地图类型 具体功能: 默认支持Android v2.1以及更高的多点触摸版 提供了50多种图表样式...

baobiaokongjian
2014/06/21
0
1
Android Bluetooth opp package 学习笔记

一、背景及相关知识学习 1、Android Bluetooth SDK 首先,要操作蓝牙,先要在AndroidManifest.xml里加入权限 <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <use......

sflfqx
2013/03/12
0
0
Android中绘制图表解决方案

本文演示在Android平台中绘制和展示图表示例,本示例是基于RChart 2实现的。 在一个系统中经常要用到图表统计数据,在WEB开发中图表绘制是一件简单的事情,因为有比较多的开源方案。但在And...

Jonson
2013/08/07
0
0
Android实现图表绘制和展示

本文演示在Android平台中绘制和展示图表示例,本示例是基于RChart 2实现的。 在一个系统中经常要用到图表统计数据,在WEB开发中图表绘制是一件简单的事情,因为有比较多的开源方案。但在And...

caikezhan
2012/04/09
0
0
[Android] Intent对象

Intent对象-Intent Objects Intent本 身是一个消息的集合。他包含那些传递给接收Intent的组件的信息(such as the action to be taken and the data to act on)和传递给Android系统的信息(...

枫兮兮
2014/02/27
0
0
在 LinearLayout里addView一个图表

activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layoutwidth="fillparent" androi......

mutouzhang
2014/03/31
0
0
众多Android开源项目推荐

标签:android 开源 原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处 、作者信息和本声明。否则将追究法律责任。http://terryblog.blog.51cto.com/1764499/547777 FBReaderJ ...

effort_fan
2011/05/10
0
3
Android 中使用 ichartjs 完成图表的展示

http://www.ichartjs.com/ ichartjs 是一款基于HTML5的图形库。使用纯javascript语言, 利用HTML5的canvas标签绘制各式图形.ichartjs致力于为您的应用提供简单、直观、可交互的体验级图表组件...

六的一批
2013/07/18
0
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

高效编写Dockerfile的几条准则

概述 Dockerfile 是专门用来进行自动化构建镜像的编排文件(就像Jenkins 2.0时代的Jenkinsfile是对Jenkins的Job和Stage的编排一样),我们可以通过 docker build 命令来自动化地从 Dockerfi...

小致dad
55分钟前
0
0
SpringBoot | 第十章:Swagger2的集成和使用

前言 前一章节介绍了mybatisPlus的集成和简单使用,本章节开始接着上一章节的用户表,进行Swagger2的集成。现在都奉行前后端分离开发和微服务大行其道,分微服务及前后端分离后,前后端开发的...

oKong
今天
9
0
Python 最小二乘法 拟合 二次曲线

Python 二次拟合 随机生成数据,并且加上噪声干扰 构造需要拟合的函数形式,使用最小二乘法进行拟合 输出拟合后的参数 将拟合后的函数与原始数据绘图后进行对比 import numpy as npimport...

阿豪boy
今天
7
0
云拿 无人便利店

附近(上海市-航南路)开了家无人便利店.特意进去体验了一下.下面把自己看到的跟大家分享下. 经得现场工作人员同意后拍了几张照片.从外面看是这样.店门口的指导里强调:不要一次扫码多个人进入....

周翔
昨天
1
0
Java设计模式学习之工厂模式

在Java(或者叫做面向对象语言)的世界中,工厂模式被广泛应用于项目中,也许你并没有听说过,不过也许你已经在使用了。 简单来说,工厂模式的出现源于增加程序序的可扩展性,降低耦合度。之...

路小磊
昨天
198
1
npm profile 新功能介绍

转载地址 npm profile 新功能介绍 npm新版本新推来一个功能,npm profile,这个可以更改自己简介信息的命令,以后可以不用去登录网站来修改自己的简介了 具体的这个功能的支持大概是在6这个版...

durban
昨天
1
0
Serial2Ethernet Bi-redirection

Serial Tool Serial Tool is a utility for developing serial communications, custom protocols or device testing. You can set up bytes to send accordingly to your protocol and save......

zungyiu
昨天
1
0
python里求解物理学上的双弹簧质能系统

物理的模型如下: 在这个系统里有两个物体,它们的质量分别是m1和m2,被两个弹簧连接在一起,伸缩系统为k1和k2,左端固定。假定没有外力时,两个弹簧的长度为L1和L2。 由于两物体有重力,那么...

wangxuwei
昨天
0
0
apolloxlua 介绍

##项目介绍 apolloxlua 目前支持javascript到lua的翻译。可以在openresty和luajit里使用。这个工具分为两种模式, 一种是web模式,可以通过网页使用。另外一种是tool模式, 通常作为大规模翻...

钟元OSS
昨天
2
0
Mybatis入门

简介: 定义:Mybatis是一个支持普通SQL查询、存储过程和高级映射的持久层框架。 途径:MyBatis通过XML文件或者注解的形式配置映射,实现数据库查询。 特性:动态SQL语句。 文件结构:Mybat...

霍淇滨
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部