MPAndroidchart实现自定义样式

先上效果:

ActivityChartLine.class:

package com.usung.mybletwo.activity;

import android.annotation.SuppressLint;

import android.database.Cursor;

import android.os.Bundle;

import android.support.annotation.Nullable;

import android.support.design.widget.TabLayout;

import android.widget.TextView;

import com.github.mikephil.charting.charts.LineChart;

import com.github.mikephil.charting.components.XAxis;

import com.github.mikephil.charting.components.YAxis;

import com.github.mikephil.charting.data.Entry;

import com.github.mikephil.charting.data.LineData;

import com.github.mikephil.charting.data.LineDataSet;

import com.usung.mybletwo.R;

import com.usung.mybletwo.base.BaseActivity;

import com.usung.mybletwo.base.BaseApplication;

import com.usung.mybletwo.bean.Tobacco;

import com.usung.mybletwo.util.LogUtils;

import com.usung.mybletwo.util.TimeUtil;

import com.usung.mybletwo.widget.MyXAxisValueFomatter;

import com.usung.mybletwo.widget.MyYAxisValueFomatter;

import org.litepal.LitePal;

import java.text.ParseException;

import java.util.ArrayList;

import java.util.Date;

import java.util.List;

/**

* Descriptions: 折线图表(可左右滑动)

* Created by fenghui on 2019/3/12.

*/

public class ActivityChartLineextends BaseActivityimplements TabLayout.OnTabSelectedListener {

private LineChartmLineChart1, mLineChart2, mLineChart3;

    @Override

    protected void onCreate(@Nullable Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_chart_line);

        getIntentValue();

//        createSqlData();

        initView();

    }

void getIntentValue(){

//        productName = getIntent().getStringExtra("productName");

    }

@Override

    public void initView() {

super.initView();

        ((TextView)findViewById(R.id.tv_title)).setText("统计曲线");

        mLineChart1 = findViewById(R.id.lineChart1);

        mLineChart2 = findViewById(R.id.lineChart2);

        mLineChart3 = findViewById(R.id.lineChart3);

        tableLayout();

        getDataAndInitChart(0); // 参数为position,position默认为0(默认按周筛选数据)

    }

void tableLayout(){

TabLayout mTabLayout = findViewById(R.id.tabLayout);

        TabLayout.Tab tab1 = mTabLayout.newTab().setText("周");

        TabLayout.Tab tab2 = mTabLayout.newTab().setText("月");

        TabLayout.Tab tab3 = mTabLayout.newTab().setText("年");

        mTabLayout.addTab(tab1);

        mTabLayout.addTab(tab2);

        mTabLayout.addTab(tab3);

        mTabLayout.addOnTabSelectedListener(this);

    }

void initChartLine(){

setChartProperties(mLineChart1, 1, list1);

        setChartProperties(mLineChart2, 2, list2);

        setChartProperties(mLineChart3, 3, list3);

    }

/**

* 原文:https://blog.csdn.net/u013855006/article/details/78702867

*/

    @SuppressLint("ResourceAsColor")

private void setChartProperties(LineChart mLineChart, int colorTag, ArrayList list) {

//设置描述文本不显示

        mLineChart.getDescription().setEnabled(false);

//        Description description = new Description();

//        description.setText(productName);

//        mLineChart.setDescription(description);

//设置是否显示表格背景

//        mLineChart.setDrawGridBackground(true);

        mLineChart.setBackgroundColor(getResources().getColor(R.color.chartLine_bg_color)); // 设置背景颜色

//设置是否可以触摸

        mLineChart.setTouchEnabled(true);

        mLineChart.setDragDecelerationFrictionCoef(0.9f);

        mLineChart.setDragEnabled(true); // 设置是否可以拖拽

        mLineChart.setScaleEnabled(false); // 设置是否可以缩放

        mLineChart.setHighlightPerDragEnabled(false); // 设置选中点高亮显示

        mLineChart.setPinchZoom(true);

        // 隐藏右边 的坐标轴

        mLineChart.getAxisRight().setEnabled(false);

        mLineChart.getAxisLeft().setEnabled(true);

        // X 轴坐标设置

        XAxis xAxis = mLineChart.getXAxis();

//        xAxis.setAxisMinimum(0);

        xAxis.setTextColor(getResources().getColor(R.color.titleColor)); // 设置X坐标轴刻度坐标文字颜色

        xAxis.setPosition(XAxis.XAxisPosition.BOTTOM); // 设置图标坐标这刻度在坐标轴下边

        xAxis.setGranularity(1f);        // 间隔尺寸

        xAxis.setGridColor(getResources().getColor(R.color.transparent)); // 设置竖网格线颜色透明,则值显示横网格线

//        xAxis.setAvoidFirstLastClipping(true);

        xAxis.setGranularity(1f);

        xAxis.setLabelCount(list.size(),true);

        xAxis.setDrawLabels(true);

        if (position ==0){

xAxis.setLabelCount(7);

            xAxis.setValueFormatter(new MyXAxisValueFomatter(position, listDateLables));

        }else if (position ==1){

xAxis.setLabelCount(6);

            xAxis.setValueFormatter(new MyXAxisValueFomatter(position, listDateLables));

        }else if (position ==2){

xAxis.setLabelCount(12);

            xAxis.setValueFormatter(new MyXAxisValueFomatter(position, listMonthLables));

        }

// Y 轴坐标设置

        YAxis yAxis = mLineChart.getAxisLeft();

        yAxis.setAxisMinimum(0);

        yAxis.setTextColor(getResources().getColor(R.color.titleColor));

        yAxis.enableGridDashedLine(10f, 5f, 0f); // 设置横网格线为虚线

        yAxis.setAxisLineColor(getResources().getColor(R.color.transparent)); // 设置Y轴坐标轴颜色透明

//        float ratio = (float) xValueList.size()/(float) 6; // 设置一页最大显示个数为6,超出部分就滑动

        yAxis.setValueFormatter(new MyYAxisValueFomatter(colorTag));

        float ratio =1;

        mLineChart.zoom(ratio,1f,0,0); // 显示的时候是按照多大的比率缩放显示,1f表示不放大缩小

        mLineChart.animateX(1500); // 设置从X轴出来的动画时间

//        mLineChart.animateXY(1000,1000, Easing.EasingOption.EaseInSine, Easing.EasingOption.EaseInSine); // 设置XY轴动画

        setChartData(mLineChart, colorTag, list);

    }

private void setChartData(LineChart mLineChart, int colorTag, ArrayList list){

LineDataSet set1;

        set1 =new LineDataSet(list, null);

        set1.setAxisDependency(YAxis.AxisDependency.LEFT);

        if (colorTag ==1){

set1.setColor(getResources().getColor(R.color.chart1_color));

            set1.setCircleColor(getResources().getColor(R.color.chart1_color));

        }else if (colorTag ==2){

set1.setColor(getResources().getColor(R.color.chart2_color));

            set1.setCircleColor(getResources().getColor(R.color.chart2_color));

        }else if (colorTag ==3){

set1.setColor(getResources().getColor(R.color.chart3_color));

            set1.setCircleColor(getResources().getColor(R.color.chart3_color));

        }

set1.setDrawValues(false); // 设置不显示点位的值,默认true

        set1.setLineWidth(2f);

        set1.setCircleRadius(3f);

        set1.setFillAlpha(65);

        LineData data =new LineData(set1);

        mLineChart.setData(data);

    }

@Override

    public void getIntentValue(@org.jetbrains.annotations.Nullable Bundle savedInstanceState) {

}

int position =0; // 默认选中周,默认按周查询

    @Override

    public void onTabSelected(TabLayout.Tab tab) {

LogUtils.Companion.log_I("--------- onTabSelected ---------- tab.getPosition() = " + tab.getPosition());

        position = tab.getPosition();

        getDataAndInitChart(position);

    }

/**

* 获取数据库筛选开始时间

    * @param position 0:周, 1:月, 2:年

    * @return

    */

    long getScreeningTime(int position){

long oneDaySeconds =24 *60 *60 *1000;

        long stampMillSecond =0;

        switch (position){

case 0:

stampMillSecond = TimeUtil.getLastWeek() + oneDaySeconds;

break;

            case 1:

//                stampMillSecond = TimeUtil.getLastMonth() + oneDaySeconds;

                String time = TimeUtil.stampToDate(new Date().getTime() -29 * oneDaySeconds);

                try {

stampMillSecond = TimeUtil.dateToStamp(time.substring(0, 10) +" 00:00:00");

                }catch (ParseException e) {

e.printStackTrace();

                }

break;

            case 2:

String date = TimeUtil.stampToDate(TimeUtil.getLastYear()).substring(0, 10) +" 00:00:00";

                try {

stampMillSecond = TimeUtil.dateToStamp(date)+oneDaySeconds;

                }catch (ParseException e) {

e.printStackTrace();

                }

break;

        }

String time = TimeUtil.stampToDate(stampMillSecond);

        long stampLastWeek =0;

        try {

stampLastWeek = TimeUtil.dateToStamp(time.substring(0, 10) +" 00:00:00");

        }catch (ParseException e) {

e.printStackTrace();

        }

return stampLastWeek;

    }

// list1、list2、list3分表表示周、月、年的抽烟支数的集合

    ArrayListlist1 =null; // 第一个表的数据集合(抽烟支数的集合)

    ArrayListlist2 =null; // 第二个表的数据集合(焦油量的集合)

    ArrayListlist3 =null; // 第三个表的数据集合(一氧化碳的集合)

    ListlistTobaccoFilter =null;

    private void initList(){

if (list1 ==null){

list1 =new ArrayList<>();

        }

if (list2 ==null){

list2 =new ArrayList<>();

        }

if (list3 ==null){

list3 =new ArrayList<>();

        }

if (listTobaccoFilter ==null){

listTobaccoFilter =new ArrayList<>();

        }

list1.clear();

        list2.clear();

        list3.clear();

    }

/**

* 按照周月年查询第一张表的数据(抽烟支数)

    * @param position

    * @return

    */

    ArrayListlistDateLables =new ArrayList<>(); // 日期label

    private void queryData(int position){

listTobaccoFilter.clear();

        long screeningTimeStart = getScreeningTime(position);

        LogUtils.Companion.log_I("------------ screeningTimeStart -------------- "+ screeningTimeStart);

        int dataCount =7;

        if (position ==0){

dataCount =7;

            List tempListTobaccoFilter = LitePal.where("bleAddress = ? and smokeDate >= ? and smokeDate <= ?",

                    BaseApplication.Companion.getInstance().getOkbleDevice().getMacAddress(),

                    screeningTimeStart +"", new Date().getTime() +"").find(Tobacco.class);

            listTobaccoFilter.addAll(tempListTobaccoFilter);

        }else if (position ==1){

dataCount =30;

            List tempListTobaccoFilter = LitePal.where("bleAddress = ? and smokeDate >= ? and smokeDate <= ?",

                    BaseApplication.Companion.getInstance().getOkbleDevice().getMacAddress(),

                    screeningTimeStart+"", new Date().getTime()  +"").find(Tobacco.class);

            listTobaccoFilter.addAll(tempListTobaccoFilter);

        }else if (position ==2){

dataCount =12;

            Cursor cursor = LitePal.findBySQL("SELECT DISTINCT t.month  ,(SELECT sum(smokeTotalToday) FROM tobacco WHERE month = t.month AND bleAddress = t.bleAddress ) AS total FROM tobacco AS t WHERE month >= "+screeningTimeStart+" AND bleAddress = '"

                    +BaseApplication.Companion.getInstance().getOkbleDevice().getMacAddress()+"' ORDER BY month");

            ArrayList tempList =new ArrayList<>();

            while (cursor.moveToNext()){

long m =cursor.getLong(cursor.getColumnIndex("month")); // 查询到的数据所在月份,m 是在查询语句中定义的

                int total = cursor.getInt(cursor.getColumnIndex("total")); // 每个月的总数,total 是在查询语句中定义的

                tempList.add(new Entry(Integer.parseInt(TimeUtil.stampToDate(m).substring(5,7)), total));

            }

// todo 单据写个方法获取12个月的数据

            get12MonthesData(dataCount, tempList);

return ;

        }

list1.clear();

        if (listTobaccoFilter ==null ||listTobaccoFilter.isEmpty()){

for (int i =1; i <= dataCount; i++) {

list1.add(new Entry(i+1, 0));

            }

}else{

listDateLables.clear();

            long newData =0;

            for (int i =0; i < dataCount; i++) {

newData = screeningTimeStart + i *3600 *24 *1000L;

                listDateLables.add(TimeUtil.stampToDateMonthAndDay(newData));

                for (int j =0; j

if (TimeUtil.isSameDate(newData, (long)listTobaccoFilter.get(j).getSmokeDate())) {

list1.add(new Entry(i+1, (float)listTobaccoFilter.get(j).getSmokeTotalToday()));

break;

                    }else{

if (j ==listTobaccoFilter.size()-1){

list1.add(new Entry(i+1, 0));

                        }

}

}

}

}

}

private void getList2OrList3(int chartType){

double tar = BaseApplication.Companion.getInstance().getListCigaretteDataChecked().get(0).getTar();

        double carbonMonoxide = BaseApplication.Companion.getInstance().getListCigaretteDataChecked().get(0).getCarbonMonoxide();

        if (chartType ==2){

list2.clear();

        }else if (chartType ==3){

list3.clear();

        }

for (int i =0; i

if (chartType ==2){

list2.add(new Entry(i +1, (float) (list1.get(i).getY() * tar)));

            }else if (chartType ==3){

list3.add(new Entry(i+1, (float) (list1.get(i).getY() * carbonMonoxide)));

            }

}

}

/**

* 获取三张表的数据(抽烟支数、焦油量、一氧化碳三个折线图的数据)

*/

    private void getDataAndInitChart(int position){

initList();

        queryData(position);

        getList2OrList3(2); // chartType 1:抽烟支数折线图  2:焦油量折线图  3:一氧化碳折线图

        getList2OrList3(3);

        initChartLine();

    }

/**

* 获取过去12个月的月份

    * @return

    */

    ArrayListlistMonthLables =new ArrayList<>(); // 月份label

    ArrayListgetMonth(int currentMonth){

listMonthLables.clear();

        ArrayList listMonth =new ArrayList<>();

        for (int i =0; i <12; i++) {

if (1 + currentMonth + i >12){

listMonthLables.add(1 + currentMonth + i -12 +"");

                listMonth.add(1 + currentMonth + i -12);

            }else {

listMonthLables.add(1 + currentMonth + i+"");

                listMonth.add(1 + currentMonth + i);

            }

}

return listMonth;

    }

/**

* 组装数据(年份数据)  12个月

    * @param dataCount

    * @param list

    */

    private ArrayListget12MonthesData(int dataCount, ArrayList list){

int currentMonth = Integer.parseInt(TimeUtil.stampToDate(new Date().getTime()).substring(5, 7));

        ArrayList listMonth = getMonth(currentMonth);

        list1.clear();

        for (int i =0; i < dataCount; i++) {

for (int m =0; m < list.size(); m++) {

if (listMonth.get(i) == (list.get(m).getX())){

list1.add(new Entry(i+1, list.get(m).getY()));

break;

                }else{

if (m == list.size() -1){

list1.add(new Entry(i+1, 0));

                    }

}

}

}

return list1;

    }

@Override

    public void onTabUnselected(TabLayout.Tab tab) {

}

@Override

    public void onTabReselected(TabLayout.Tab tab) {

}

}


自定义X轴刻度:

package com.usung.mybletwo.widget;

import com.github.mikephil.charting.components.AxisBase;

import com.github.mikephil.charting.formatter.IAxisValueFormatter;

import java.util.ArrayList;

/**

* Descriptions: 自定义 MPAndroidChart X轴坐标刻度值

* Created by fenghui on 2019/4/12.

*/

public class MyXAxisValueFomatterimplements IAxisValueFormatter {

int position =0;

    ArrayListlistXLables =null;

    /**

    * @param position 此type参数同ActivityChartLine里面的position是一回事,默认为0

*                position=0:按周筛选(筛选过去7天),position=1:按月筛选(筛选过去30天),position=2:按年筛选(筛选过去一年)

*/

    public MyXAxisValueFomatter(int position, ArrayList listXLables) {

this.position = position;

        this.listXLables = listXLables;

    }

@Override

    public StringgetFormattedValue(float value, AxisBase axis) {

try {// try catch 是因为有一个莫名其妙的错误

            String tempValue ="";

            if (value ==0) {

tempValue = (int) value +"";

            }else {

switch (position) {

case 0:

if (value !=7) {

tempValue =listXLables.get((int) value -1);

                        }else {

tempValue =listXLables.get((int) value -1);

                        }

break;

                    case 1:

if (value !=30) {

tempValue =listXLables.get((int) value -1);

                        }else {

tempValue =listXLables.get((int) value -1);

                        }

break;

                    case 2:

if (value !=12) {

tempValue =listXLables.get((int) value -1);

                        }else {

tempValue =listXLables.get((int) value -1) +"(月)";

                        }

break;

                }

}

return tempValue;

        }catch (Exception e) {

return "";

        }

}

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容