android详解_MPAndroidChart

android详解_MPAndroidChart在开发当中曲线图用的时候太多了,之前都是自己手写,之后发现太累还丑不符合需求MPAndroidChart先介绍LineChart0.效果图首先依赖1. implementation

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

在开发当中曲线图用的时候太多了,之前都是自己手写,之后发现太累还丑不符合需求

MPAndroidChart

先介绍LineChart

0.效果图

android详解_MPAndroidChart

首先依赖  1. implementation ‘com.github.PhilJay:MPAndroidChart:v3.0.3’

2.xml布局

<com.github.mikephil.charting.charts.LineChart
android:id="@+id/multi_line_Gl_chart"
android:layout_width="match_parent"
android:layout_height="100dp"
android:layout_marginStart="17.5dp" />

3.逻辑代码

我这里的需求是获取24小时电量,不允许滑动缩放,X 24小时轴是只显示偶数

Y轴数据精确到小数点两位,Y轴最大值为获取数据集合最大值,最大值小于1的时候最大值进1加0.1。大于1的时候最大值增加20%。。。。大概就是这样        //左图具有描述设置,默认有描述,我这里是之前有这个需求现在没啦

最后的最后我这个是双曲线,至于单曲线或者多个曲线,增加删除就可以


Description description = new Description();
        description.setText("");
        description.setTextAlign(Paint.Align.CENTER);
        description.setTextSize(16);
        description.setPosition(200, 150);
        description.setTextColor(ContextCompat.getColor(this, android.R.color.holo_blue_bright));
        multiLineGlChart.setDescription(description);


        multiLineGlChart.setHighlightPerTapEnabled(false);//隐藏图表内的点击十字线
        multiLineGlChart.setHighlightPerDragEnabled(false);


        //设置是否后台绘制
        multiLineGlChart.setDrawGridBackground(false);
        //设置支持触控手势
        multiLineGlChart.setTouchEnabled(false);
        //设置缩放
        multiLineGlChart.setDragEnabled(true);
        //设置推动
        multiLineGlChart.setScaleEnabled(false);
        //如果禁用,扩展可以在x轴和y轴分别完成
        multiLineGlChart.setPinchZoom(false);
        Matrix m = new Matrix();
        m.postScale(1, 1f);//两个参数分别是x,y轴的缩放比例。例如:将x轴的数据放大为之前的1.5倍,《这个地方是在设置能滑动的时候编辑的,假如X轴最多展示5条但是呢有10条数据,那么这里就是2,1》
        multiLineGlChart.getViewPortHandler().refresh(m, multiLineGlChart, true);//将图表动画显示之前进行缩放
        multiLineGlChart.animateX(1000); // 动画,x轴

        //设置图例
        Legend legend = multiLineGlChart.getLegend();
        legend.setVerticalAlignment(Legend.LegendVerticalAlignment.TOP);//设置显示在顶部
        legend.setHorizontalAlignment(Legend.LegendHorizontalAlignment.CENTER);//设置图例的显示位置为居中
        legend.setOrientation(Legend.LegendOrientation.HORIZONTAL);//设置图例显示的布局为横线排列
        legend.setTextSize(10f);//设置图例文本的字体大小,根据界面显示自行调配
        //配置X轴
        XAxis xAxis = multiLineGlChart.getXAxis();
        xAxis.setAxisMinimum(0);//X轴最大值最小值,
        xAxis.setGranularity(1);//设置X轴每个点之间数据的间隔
        xAxis.setLabelCount(5, false);//设置标签个数
        xAxis.setPosition(XAxis.XAxisPosition.BOTTOM); //设置x标签显示的在底部
        xAxis.setDrawGridLines(false);//不画X轴网格线
        xAxis.setDrawAxisLine(false);
        xAxis.setValueFormatter(new IAxisValueFormatter() {
            @Override
            public String getFormattedValue(float value, AxisBase axis) {//switch是当知道X轴有多少个的时候,下一个是不知道X轴数据数量的情况
 switch (index) {
                    case 1:
                        label = "00";
                        break;
                    case 2:
                        label = "";
                        break;
                    case 3:
                        label = "02";
                        break;
                    case 4:
                        label = "";
                        break;
                    case 5:
                        label = "04";
                        break;
                    case 6:
                        label = "";
                        break;
                    case 7:
                        label = "06";
                        break;
                    case 8:
                        label = "";
                        break;
                    case 9:
                        label = "08";
                        break;
                    case 10:
                        label = "";
                        break;
                    case 11:
                        label = "10";
                        break;
                    case 12:
                        label = "";
                        break;
                    case 13:
                        label = "12";
                        break;
                    case 14:
                        label = "";
                        break;
                    case 15:
                        label = "14";
                        break;
                    case 16:
                        label = "";
                        break;
                    case 17:
                        label = "16";
                        break;
                    case 18:
                        label = "";
                        break;
                    case 19:
                        label = "18";
                        break;
                    case 20:
                        label = "";
                        break;
                    case 21:
                        label = "20";
                        break;
                    case 22:
                        label = "";
                        break;
                    case 23:
                        label = "22";
                        break;
                    case 24:
                        label = "";
                        break;
                    case 25:
                        label = "24";
                        break;
                    default:
                        label = "";
                        break;
                }
                int index = (int) value;
                if (value==time.size()&&(int) value % time.size()==0){//假如没有这个if会造成的后果是,当数据为40条的时候会出现最后一条数据取得值是第一条数据,so
                    String tradeDate = time.get(time.size()-1).substring(11,16);
                    return tradeDate;
                }else{
                    String tradeDate = time.get((int) value % time.size()).substring(11,16);
                    return tradeDate;
                }

            }
        });
        xAxis.setTextColor(ContextCompat.getColor(this, R.color.text_color));//设置标签的文本颜色
        YAxis axisRight = multiLineGlChart.getAxisRight();
        axisRight.removeAllLimitLines();
        axisRight.setDrawAxisLine(false);//设置不画左边线的第一条线
        axisRight.setDrawGridLines(true);
        YAxis leftAxis = multiLineGlChart.getAxisLeft();
        leftAxis.removeAllLimitLines();
        leftAxis.setPosition(YAxis.YAxisLabelPosition.OUTSIDE_CHART);
        List<Double> list=new ArrayList<>();//以下的代码是最大值的设置,个人最大值设置方法,也是需求,so,可以自己更改
        for (int i = 0; i < last.size(); i++) {
            try {
                list.add(Double.valueOf(last.get(i)));
            } catch (NumberFormatException e) {
                e.printStackTrace();
            }
        }

        double max = Collections.max(list)/1000;
        double min = Collections.min(list);

        List<Double> listNow=new ArrayList<>();
        for (int i = 0; i < now.size(); i++) {
            try {
                listNow.add(Double.valueOf(now.get(i).replaceAll("\\-","0")));
            } catch (NumberFormatException e) {
                e.printStackTrace();
            }
        }
        double minNow = Collections.min(listNow);
        double maxNow = Collections.max(listNow)/1000;

        if (max>maxNow){
//            leftAxis.setAxisMaximum((float)Math.ceil(max*1.2));//设置最大值
            if (max>1){
                leftAxis.setAxisMaximum((float) Math.ceil(max*1.2));//设置最大值
            }else{
                leftAxis.setAxisMaximum((float) (max+0.1));//设置最大值
            }
        }else{
//            leftAxis.setAxisMaximum((float) Math.ceil(maxNow*1.2));//设置最大值
            if (maxNow>1){
                leftAxis.setAxisMaximum((float) Math.ceil(maxNow*1.2));//设置最大值
            }else{
                leftAxis.setAxisMaximum((float) (maxNow+0.1));//设置最大值
            }
        }
        leftAxis.setAxisMinimum(0f);//设置最小值
        leftAxis.setLabelCount(4,true);//设置标签的个数
        leftAxis.setDrawAxisLine(false);//设置不画左边线的第一条线


        //设置坐标轴标签文字样式
        leftAxis.setTypeface(Typeface.DEFAULT_BOLD);
        //设置此轴网格线颜色
        leftAxis.setGridColor(Color.parseColor("#1A00CAE3"));
        //设置此轴网格线宽度
        leftAxis.setGridLineWidth(0.5f);
        //设置坐标轴的颜色
        leftAxis.setAxisLineColor(Color.parseColor("#1A00CAE3"));
        //设置坐标轴的宽度
        leftAxis.setAxisLineWidth(1f);
        //使用虚线组成的网格线
        //参数:linelength:虚线长度
        // spacelength:虚线间隔长度
        // phase:虚线出发点(从第一根虚线的哪里出发)
        leftAxis.enableGridDashedLine(5f, 10f, 20f);

        leftAxis.setDrawGridLines(true);


        //自定义标签显示
        leftAxis.setValueFormatter(new IAxisValueFormatter() {
            @Override
            public String getFormattedValue(float value, AxisBase axis) {
//                int val = (int) value;//这里是设置是否是显示成小数或者整数
                String val;
                DecimalFormat df = new DecimalFormat("#0.00");
                val = df.format(value);
                return val + "";

            }
        });
        //设置标签文本颜色
        leftAxis.setTextColor(ContextCompat.getColor(this, R.color.text_color));

        multiLineGlChart.getAxisRight().setEnabled(false);//设置右侧Y轴不显示


        //第二条线
        List<Entry> values2 = new ArrayList<>();

//
        for (int i = 0; i < now.size(); i++) {
//            values2.add(new Entry((i+1), 120));
//            values2.add(new Entry((i+1), (Float.valueOf(String.valueOf(now.get(i))))/1000));
            values2.add(new BarEntry((i + 1),(Float.valueOf(String.valueOf(now.get(i))))/1000));
        }


        LineDataSet lineDataSet2 = new LineDataSet(values2, "");
        /*
            LINEAR,直线
            STEPPED,
            CUBIC_BEZIER,
            HORIZONTAL_BEZIER
         */
        lineDataSet2.setMode(LineDataSet.Mode.CUBIC_BEZIER);//设置折线图的显示模式,可以自行设置上面的值进行查看不同之处
        lineDataSet2.setColor(ContextCompat.getColor(this, R.color.color29ca5a));//设置线的颜色
        lineDataSet2.setLineWidth(1.5f);//设置线的宽度
        lineDataSet2.setDrawCircles(false);
        lineDataSet2.setDrawCircleHole(false);
        lineDataSet2.setAxisDependency(YAxis.AxisDependency.LEFT);//设置线数据依赖于左侧y轴
        lineDataSet2.setDrawFilled(false);//设置不画数据覆盖的阴影层
        lineDataSet2.setDrawValues(false);//不绘制线的数据
        lineDataSet2.setValueTextColor(ContextCompat.getColor(this, R.color.text_color));//设置数据的文本颜色,如果不绘制线的数据 这句代码也不用设置了
        lineDataSet2.setValueTextSize(15f);//如果不绘制线的数据 这句代码也不用设置了
        lineDataSet2.setCircleRadius(4f);//设置每个折线点的大小
        lineDataSet2.setFormSize(0f);//设置当前这条线的图例的大小
        lineDataSet2.setForm(Legend.LegendForm.CIRCLE);//设置图例显示为线
        lineDataSet2.setValueFormatter(new IValueFormatter() {
            @Override
            public String getFormattedValue(float value, Entry entry, int dataSetIndex, ViewPortHandler viewPortHandler) {
//                int val = (int) value;
                String val;
                DecimalFormat df = new DecimalFormat("#0.00");
                val = df.format(value);
                return val + "";
            }
        });


        //第三条线
        List<Entry> values3 = new ArrayList<>();
        for (int i = 0; i < last.size(); i++) {
//            values3.add(new Entry((i+1), 110));
            values3.add(new BarEntry((i + 1), (Float.valueOf(String.valueOf(last.get(i))))/1000));
        }


        LineDataSet lineDataSet3 = new LineDataSet(values3, "");
        /*
            LINEAR,直线
            STEPPED,
            CUBIC_BEZIER,
            HORIZONTAL_BEZIER
         */
        lineDataSet3.setMode(LineDataSet.Mode.HORIZONTAL_BEZIER);//设置折线图的显示模式,可以自行设置上面的值进行查看不同之处
        lineDataSet3.setColor(ContextCompat.getColor(this, R.color.colorFFC738));//设置线的颜色
        lineDataSet3.setLineWidth(1.5f);//设置线的宽度
        lineDataSet3.setDrawCircles(false);

        lineDataSet3.setDrawCircleHole(false);
        lineDataSet3.setAxisDependency(YAxis.AxisDependency.LEFT);//设置线数据依赖于左侧y轴
        lineDataSet3.setDrawFilled(false);//设置不画数据覆盖的阴影层
        lineDataSet3.setDrawValues(false);//不绘制线的数据
        lineDataSet3.setValueTextColor(ContextCompat.getColor(this, R.color.text_color));//设置数据的文本颜色,如果不绘制线的数据 这句代码也不用设置了
        lineDataSet3.setValueTextSize(15f);//如果不绘制线的数据 这句代码也不用设置了
        lineDataSet3.setCircleRadius(4f);//设置每个折线点的大小
        lineDataSet3.setFormSize(0f);//设置当前这条线的图例的大小
        lineDataSet3.setForm(Legend.LegendForm.CIRCLE);//设置图例显示为线
        lineDataSet3.setValueFormatter(new IValueFormatter() {
            @Override
            public String getFormattedValue(float value, Entry entry, int dataSetIndex, ViewPortHandler viewPortHandler) {
                String val;
                DecimalFormat df = new DecimalFormat("#0.00");
                val = df.format(value);
                return val + "";
            }
        });


        //初始化一个LineDataSet集合来装每个线的数据
        List<ILineDataSet> lineDataSetList = new ArrayList<>();


        if (chbGlJr.isChecked() && chbGlZr.isChecked()) {
            lineDataSetList.add(lineDataSet3);
            lineDataSetList.add(lineDataSet2);

        } else if (chbGlJr.isChecked() && !chbGlZr.isChecked()) {
            lineDataSetList.add(lineDataSet2);
        } else if (!chbGlJr.isChecked() && chbGlZr.isChecked()) {
            lineDataSetList.add(lineDataSet3);
        }


        //将多条线的数据全部给LineData
        LineData lineData = new LineData(lineDataSetList);
        multiLineGlChart.setData(lineData);

        //默认动画
        multiLineGlChart.animateXY(1000, 1000);

  


  


日常许愿五星曹大爷刘大爷,祭品全服
android详解_MPAndroidChart
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/166963.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • CSS伪类与伪元素「建议收藏」

    CSS伪类与伪元素「建议收藏」为什么要引入伪类与伪元素?css引入伪类和伪元素概念是为了格式化文档树以外的信息。也就是说,伪类和伪元素是用来修饰不在文档树中的部分,比如,一句话中的第一个字母,或是列表中的第一个元素,又或者是鼠标悬停在某个超链接上时要设置的样式。什么是伪类,伪元素?伪类:用于当已有元素处于的某个状态时,为其添加对应的样式,这个状态是根据用户行为而动态变化的。比如说,当用户悬停在指定的元素时,我们可以…

    2025年8月25日
    4
  • 【系统架构设计师】第一章:操作系统(1.2.2) 信号量与pv操作

    【系统架构设计师】第一章:操作系统(1.2.2) 信号量与pv操作本篇帖子继续上篇。有兴趣可以点击链接进行查看以前写过的文章。【系统架构设计师】第一章:操作系统(1.2.2)参考教材:《系统架构设计师考试全程指导(第二版)》《系统架构设计师教程》1.2.2信号量与pv操作pv操作指的是两个:p操作和v操作。有时候我们的进程在工作的时候,需要同时配合来干多件事情。比如,我们规定一个进程用来写入数据,另一个进程用来读取数据。很显然,这连个进程是不能互相干扰的…

    2022年7月15日
    23
  • mysql 设置主键命令_MySQL常用命令

    mysql 设置主键命令_MySQL常用命令1、修改MySQL密码方法一:usemysql;updateusersetpassword=PASSWORD(“123456”)whereuser=‘root’;flushprivileges;忘记密码:sed-ri’3dskip-grant-tables’/etc/my.cnfsystemctlrestartmariadbusemysql;updateuse…

    2022年6月20日
    29
  • 线程与进程,你真得理解了吗

    线程与进程,你真得理解了吗相信大家面试时一定没少被一个问题刁难,那就是进程和线程的区别是什么?这个问题延申开来并不像表面那么简单,今天就来深入一探。开始前先看一组非常传神的图例,相信可以帮助你更好理解进程与线程的概念:1进程与线程的关系和区别什么是进程进程可以说是一个“执行中的程序”。程序是指令、数据及其组织形式的描述,是一个没有生命的实体,只有处理器赋予程序生命时(操作系统执行之),它才能成为一个活动的实体,我们称其为进程。进程有哪些特征?进程依赖于程序运行而存在,进程是动态的,程序是静态的;进程是操作系统进行

    2022年7月25日
    10
  • vue 修改引入组件的样式_vue子组件的子组件布局

    vue 修改引入组件的样式_vue子组件的子组件布局意义vue被广大前端推崇很重要一点就是组件封装,但是在组件封装的时候,组件可能在各处都要用到,但是在各处的样式可能不太一样,例如:按钮组件,这时怎么办,难道不同样式但是结构相同的组件进行多次封装么?很明显是很不合算的。用代码说话父组件:<template><el-containerclass=”layout_container”><el-headerheight=”auto”><header-top></header-top&

    2025年11月29日
    7
  • GFS – The Google File System

    GFS – The Google File SystemTheGoogleFileSystemhttp://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.125.789&amp;rep=rep1&amp;type=pdfhttp://www.dbthink.com/?p=501,中文翻译 Google牛人云集的地方,但在设计系统时,却非常务实,没有采用什么复杂和时髦…

    2022年6月1日
    31

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号