返回顶部
首页 > 资讯 > 移动开发 >Android LineChart绘制折线图的示例详解
  • 686
分享到

Android LineChart绘制折线图的示例详解

摘要

1.首先在 build.gradle 里导入包 implementation 'com.GitHub.PhilJay:MPAndroidChart:v3.1.0'&n

1.首先在 build.gradle 里导入包

implementation 'com.GitHub.PhilJay:MPAndroidChart:v3.1.0' 

2.新建 启动Activity  

LineChartActivity 如下

**
 * @Author: Bytezero_zhengLei
 * @Time: 2023/3/24 10:12
 * @Project_Name: LineChartActivity.java
 * @Email: 420498246@qq.com
 * @Description:
 * @TODO: 折线图
 */

public class LineChartActivity extends AppCompatActivity {

    private LineChart lineChart;
    List<IncomeBean> list = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_line_chart);

        lineChart = (LineChart) findViewById(R.id.linechart);

        lineChart = MPAndroidUtil.initChart(this, lineChart);




        for (int i =0; i <10; i ++){
            IncomeBean incomeBean = new IncomeBean(36.5,"2020-01-01 00:00:00");
            list.add(incomeBean);

        }

        // 开始画折线图
        setLineChart(list, "BMI" + "kg/²", getResources().getColor(R.color.bule_title));
    }


    //设置折线


    public void setLineChart(List<IncomeBean> mLineChart, String string, int color) {
        lineChart = MPAndroidUtil.initChart(this, lineChart);
        lineChart.setData(MPAndroidUtil.showLineChart(mLineChart, string, color));
        //设置一页最大显示个数为6,超出部分就滑动
        float ratio = (float) mLineChart.size() / (float) 6;
        //显示的时候是按照多大的比率缩放显示,1f表示不放大缩小
        // lineChart.zoom(ratio, 1f, 0, 0);
        // 设置填充图
        Drawable drawable = getResources().getDrawable(R.drawable.fade_blue);
        MPAndroidUtil.setChartFillDrawable(drawable, lineChart);
        // 设置点击的弹窗
        MPAndroidUtil.setMarkerView1(lineChart);


       

    }
}

3.新建数据 IncomeBean



public class IncomeBean implements Serializable {
    public String tradeDate;// 时间
    public double value;// 数值

    public IncomeBean(double mValue, String mTradeDate) {
        tradeDate = mTradeDate;
        value = mValue;
    }

    @Override
    public String toString() {
        return "IncomeBean{" +
                "tradeDate='" + tradeDate + '\'' +
                ", value=" + value +
                '}';
    }
}

4.制定折线图的属性  MPAndroidUtil



public class MPAndroidUtil {
    private static final String TAG = "MPAndroidUtil";
    private static XAxis xAxis = null;                //X轴
    private static YAxis leftYAxis;            //左侧Y轴
    private static YAxis rightYaxis;           //右侧Y轴
    private static Legend legend;              //图例


    
    public static LineChart initChart(Context context, LineChart lineChart) {

        
        //是否展示网格线
        lineChart.setDrawGridBackground(false);
        //是否显示边界
        lineChart.setDrawBorders(false);
        //是否可以拖动
        lineChart.setDragEnabled(false);
        //是否有触摸事件
        lineChart.setTouchEnabled(true);
        // 关闭双击放大功能
        lineChart.setDoubleTapToZoomEnabled(false);
        //设置XY轴动画效果
        lineChart.animateY(2500);
        lineChart.animateX(1500);

        lineChart.setBackgroundColor(context.getResources().getColor(R.color.white));


        
        xAxis = null;
        xAxis = lineChart.getXAxis();
        leftYAxis = lineChart.getAxisLeft();
        rightYaxis = lineChart.getAxisRight();
        //X轴设置显示位置在底部
        xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
        xAxis.setAxisMinimum(0f);
        xAxis.setGranularity(1f);
        //保证Y轴从0开始,不然会上移一点
        leftYAxis.setAxisMinimum(0f);
        rightYaxis.setAxisMinimum(0f);

        // 但还是显示了网格线,而且不是我们想要的 虚线 。其实那是 X Y轴自己的网格线,禁掉即可
        xAxis.setDrawGridLines(false);
        rightYaxis.setDrawGridLines(false);
        leftYAxis.setDrawGridLines(true);
        //设置X Y轴网格线为虚线(实体线长度、间隔距离、偏移量:通常使用 0)
        leftYAxis.enableGridDashedLine(10f, 10f, 0f);
        // 目标效果图没有右侧Y轴,所以去掉右侧Y轴
        rightYaxis.setEnabled(false);

        
        legend = lineChart.getLegend();
        //legend.setEnabled(false);
        //设置显示类型,LINE CIRCLE SQUARE EMPTY 等等 多种方式,查看LegendFORM 即可
        legend.setForm(Legend.LegendForm.LINE);
        legend.setTextSize(12f);
        //显示位置 左下方
        legend.setVerticalAlignment(Legend.LegendVerticalAlignment.TOP);
        legend.setHorizontalAlignment(Legend.LegendHorizontalAlignment.LEFT);
        legend.setOrientation(Legend.LegendOrientation.HORIZONTAL);
        //是否绘制在图表里面
        legend.setDrawInside(false);
        // legend.setExtra(mLegendEntries);

//        lineChart.setNoDataText(context.getResources().getString(R.string.No_data));
        lineChart.setNoDataText("  ");
        // 设置右下角的提示
        Description description = new Description();
//        description.setText("需要展示的内容");
        description.setEnabled(false);
        lineChart.setDescription(description);

        lineChart.setExtraBottomOffset(2 * 8f);

        lineChart.setXAxisRenderer(new CustomXAxisRenderer(lineChart.getViewPortHandler(), lineChart.getXAxis(), lineChart.getTransformer(YAxis.AxisDependency.LEFT)));
        return lineChart;
    }


    
    public static LineDataSet initLineDataSet(LineDataSet lineDataSet, int color, LineDataSet.Mode mode) {
        lineDataSet.setColor(color);
        lineDataSet.setCircleColor(color);
        lineDataSet.setLineWidth(1f);
        lineDataSet.setCircleRadius(2f);
        //设置曲线值的圆点是实心还是空心
        lineDataSet.setDrawCircleHole(true);
        lineDataSet.setValueTextSize(10f);
        //设置折线图填充
        lineDataSet.setDrawFilled(true);
        lineDataSet.setFormLineWidth(1f);
        lineDataSet.setFormSize(15.f);
        if (mode == null) {
            //设置曲线展示为圆滑曲线(如果不设置则默认折线)
            lineDataSet.setMode(LineDataSet.Mode.CUBIC_BEZIER);
        } else {
            lineDataSet.setMode(mode);
        }
        // 不显示值
        lineDataSet.setDrawValues(false);
        return lineDataSet;

    }

    public static LineData showLineChart(final List<IncomeBean> dataList, String name, int color) {
        List<Entry> entries = new ArrayList<>();
        for (int i = 0; i < dataList.size(); i++) {
            IncomeBean data = dataList.get(i);
            
            Entry entry = new Entry(i, (float) data.value);
            entries.add(entry);
        }
        xAxis.setValueFormatter(new IndexAxisValueFormatter() {
            @Override
            public String getFormattedValue(float value) {
                String tradeDate;
                try {
                    tradeDate = dataList.get((int) value % dataList.size()).tradeDate;
                } catch (Exception mE) {
                    tradeDate = "2020-01-01 00:00:00";
                }

                return StrToStr("yyyy-MM-dd HH:mm:ss", "MM-dd HH:mm", tradeDate);
            }
        });


        xAxis.setLabelCount(6, false);

        leftYAxis.setLabelCount(8);
        // 每一个LineDataSet代表一条线
        LineDataSet lineDataSet = new LineDataSet(entries, name);
        lineDataSet = initLineDataSet(lineDataSet, color, LineDataSet.Mode.CUBIC_BEZIER);
        LineData lineData = new LineData(lineDataSet);
        return lineData;

    }

    public static void setMarkerView1(LineChart lineChart) {
//        LineChartMarkView1 mv = new LineChartMarkView1(MApplication.getInstance(), xAxis.getValueFormatter());
        LineChartMarkView1 mv = new LineChartMarkView1(lineChart.getContext(), xAxis.getValueFormatter());
        mv.setChartView(lineChart);
        lineChart.setMarker(mv);
        lineChart.invalidate();
    }


    
    public static LineChart setChartFillDrawable(Drawable drawable, LineChart mLineChart) {
        if (mLineChart.getData() != null && mLineChart.getData().getDataSetCount() > 0) {
            LineDataSet lineDataSet = (LineDataSet) mLineChart.getData().getDataSetByIndex(0);
            //避免在 initLineDataSet()方法中 设置了 lineDataSet.setDrawFilled(false); 而无法实现效果
            lineDataSet.setDrawFilled(true);
            lineDataSet.setFillDrawable(drawable);

            mLineChart.invalidate();

        }
        return mLineChart;
    }


    // 传入某种格式的时间格式,得到特定的时间格式
    public static String StrToStr(String SimpleDateFormat_in, String SimpleDateFormat_out, String str) {
        SimpleDateFormat format = new SimpleDateFormat(SimpleDateFormat_in);
        SimpleDateFormat format1 = new SimpleDateFormat(SimpleDateFormat_out);
        Date date = null;
        try {
            date = format.parse(str);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return format1.format(date.getTime());
    }


}

5.LineChartMarkView1

**
 * @Author: Bytezero_zhengLei
 * @Time: 2023/3/24 10:45
 * @Project_Name: LineChartMarkView1.java
 * @Email: 420498246@qq.com
 * @Description:
 * @TODO:
 */

public class LineChartMarkView1 extends MarkerView {

    private TextView tvDate;
    private TextView tvValue;
    private IAxisValueFormatter xAxisValueFormatter;
    DecimalFormat df = new DecimalFormat(".00");

    public LineChartMarkView1(Context context, IAxisValueFormatter xAxisValueFormatter) {
        super(context, R.layout.layout_markview1);
        this.xAxisValueFormatter = xAxisValueFormatter;

        tvDate = findViewById(R.id.tv_date);
        tvValue = findViewById(R.id.tv_value);
    }

    @SuppressLint("SetTextI18n")
    @Override
    public void refreshContent(Entry e, Highlight highlight) {
        Chart chart = getChartView();
        if (chart instanceof LineChart) {
            LineData lineData = ((LineChart) chart).getLineData();
            //获取到图表中的所有曲线
            List<ILineDataSet> dataSetList = lineData.getDataSets();
            for (int i = 0; i < dataSetList.size(); i++) {
                LineDataSet dataSet = (LineDataSet) dataSetList.get(i);
                //获取到曲线的所有在Y轴的数据集合,根据当前X轴的位置 来获取对应的Y轴值
                float y = dataSet.getValues().get((int) e.getX()).getY();
                if (i == 0) {
                    tvValue.setText(dataSet.getLabel() + ":" + e.getY());
                }
            }
            tvDate.setText(xAxisValueFormatter.getFormattedValue(e.getX(), null));
        }

        super.refreshContent(e, highlight);
    }

    @Override
    public MPPointF getOffset() {
        return new MPPointF(-(getWidth() / 2), -getHeight());

    }
}

6.CustomXAxisRenderer



public class CustomXAxisRenderer extends XAxisRenderer {
    public CustomXAxisRenderer(ViewPortHandler viewPortHandler, XAxis xAxis, Transformer trans) {
        super(viewPortHandler, xAxis, trans);
    }

    @Override
    protected void drawLabel(canvas c, String formattedLabel, float x, float y, MPPointF anchor, float angleDegrees) {
//        super.drawLabel(c, formattedLabel, x, y, anchor, angleDegrees);//注释掉这个,否则坐标标签复写两次
        String[] lines = formattedLabel.split(" ");
        for (int i = 0; i < lines.length; i++) {
            float vOffset = i * mAxisLabelPaint.getTextSize();
            Utils.drawXAxisValue(c, lines[i], x, y + vOffset, mAxisLabelPaint, anchor, angleDegrees);
        }
    }
}

7.一些 小的  layout  

LineChartMarkView1的layout

<LinearLayout xmlns:android="Http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/shape_square"
    android:orientation="vertical">

    <TextView
        android:id="@+id/tv_date"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@android:color/white" />

    <TextView
        android:id="@+id/tv_value"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp"
        android:textColor="@android:color/white" />
</LinearLayout>

LineChartActivity中的 layout

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".LineChart.LineChartActivity">

    <com.github.mikephil.charting.charts.LineChart
        android:layout_gravity="center"
        android:id="@+id/linechart"
        android:layout_width="match_parent"
        android:layout_height="300dp" />

</LinearLayout>

这样就ok了

到此这篇关于Android LineChart绘制折线图的示例详解的文章就介绍到这了,更多相关Android LineChart折线图内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Android LineChart绘制折线图的示例详解

本文链接: https://lsjlt.com/news/201175.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Android LineChart绘制折线图的示例详解
    1.首先在 build.gradle 里导入包 implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'&n...
    99+
    2023-03-24
    Android LineChart绘制折线图 Android LineChart折线图 Android LineChart
  • 怎么使用Android LineChart绘制折线图
    这篇文章主要介绍“怎么使用Android LineChart绘制折线图”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用Android LineChart绘制折线图”文章能帮...
    99+
    2023-07-05
  • Python pyecharts绘制折线图详解
    一、绘制折线图 import seaborn as sns import numpy as np import pandas as pd import matplotlib as m...
    99+
    2024-04-02
  • Android绘制双折线图的方法
    本文实例为大家分享了Android绘制双折线图的具体代码,供大家参考,具体内容如下 自定义View实现双折线图,可点击,点击后带标签描述,暂未实现拖动的功能,实现效果如下: 代码如...
    99+
    2024-04-02
  • Android怎么绘制双折线图
    本篇内容主要讲解“Android怎么绘制双折线图”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Android怎么绘制双折线图”吧!自定义View实现双折线图,可点击,点击后带标签描述,暂未实现拖...
    99+
    2023-06-29
  • Android画图实现MPAndroidchart折线图示例详解
    目录效果图依赖activity.xmlMainActivityMyMarkerView 自定义classmaekertextview .xml常用属性效果图 用的是3.1.0的依赖...
    99+
    2024-04-02
  • android绘制曲线和折线图的方法
    本文实例为大家分享了android绘制曲线和折线图的具体代码,供大家参考,具体内容如下 (曲线)  (折线) 1.CurveView.java package com....
    99+
    2024-04-02
  • Android图表库HelloChart绘制多折线图
    本文实例为大家分享了Android图表库HelloChart绘制多折线图的具体代码,供大家参考,具体内容如下 一、效果图 二、实现步骤 1.添加依赖库 compile 'com.g...
    99+
    2024-04-02
  • 基于Echart实现折线图的绘制详解
    效果图 不显示折线图上的拐点方法 ,3个都可以使用,代码中有显示在什么位置使用。 symbolSize:0, symbol:“none”, showSymb...
    99+
    2024-04-02
  • python 用matplotlib绘制折线图详情
    目录1. 折线图概述 1.1什么是折线图? 1.2折线图使用场景 1.3绘制折线图步骤 1.4案例展示 2. 折线2D属性 2.1linestyle:折线样式 2.2color:折线...
    99+
    2024-04-02
  • python数据可视化matplotlib绘制折线图示例
    目录plt.plot()函数各参数解析各参数具体含义为:x,ycolorlinestylelinewidthmarker关于marker的参数plt.plot()函数各参数解析 pl...
    99+
    2024-04-02
  • 怎么用Android的HelloChart绘制多折线图
    本文小编为大家详细介绍“怎么用Android的HelloChart绘制多折线图”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么用Android的HelloChart绘制多折线图”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来...
    99+
    2023-06-29
  • Android 使用MPAndroidChart:v3.1.0绘制动态折线图
    工作需要绘制一张可动态添加的折线图,经过筛选,选择MPAndroidChart:v3.1.0。 **使用方法:** 1、添加bui...
    99+
    2022-06-06
    折线图 mpandroidchart 动态 Android
  • Android实现绘制折线图APP代码
    目录一.总体设计二.具体模块实现三.效果展示四.功能展望总结一.总体设计 1.寻找规律,公式化的生成坐标系。 2.将生成坐标系的关键参数设置为可自定义,从而可变的可以生成自己想要的坐...
    99+
    2024-04-02
  • D3.js实现绘制折线图的教程详解
    目录x轴比例尺数据折线d3.lined3.area水平方向垂直方向总结本章我们来实现一下折线图,有了画柱状图的经验,我们可以快速的分析出柱状图和折线图的区别主要是x轴比例尺和绘制数据...
    99+
    2022-11-13
    D3.js绘制折线图 D3.js 折线图
  • Python绘制交通流折线图详情
    目录一、数据集下载二、折线图绘制1、解压npz文件2、折线图绘制一、数据集下载 加州高速公路PEMS数据集 这里绘制PEMS04中的交通流量数据。该数据集中包含旧金山2018年1月1...
    99+
    2024-04-02
  • R语言绘制line plot线图示例详解
    目录Step1. 绘图数据的准备Step2. 绘图数据的读取Step3. 绘图所需package的安装、调用Step4. 绘图最近小仙同学在Nature Cell Biology上看...
    99+
    2024-04-02
  • QtQChart实现折线图的绘制
    目录前言1.使用2.效果如下3.具体实现如下4.刷新QChart5.PCL 点排序前言 QChart  是常用的图表;我这里做了一个 default 和 custom 1....
    99+
    2023-05-17
    Qt QChart绘制折线图 Qt QChart折线图 Qt QChart
  • 详解Android图表 MPAndroidChart折线图
    1.介绍 MPAndroidChart GitHub地址  MPAndroidChart的强大之处就不在多说了,目前最新的版本是3.0.1,在新版本中很多方法都被...
    99+
    2022-06-06
    android图表 mpandroidchart Android
  • R语言绘制折线图实例分析
    折线图是通过在它们之间绘制线段来连接一系列点的图。 这些点在它们的坐标(通常是x坐标)值之一中排序。 折线图通常用于识别数据中的趋势。 R语言中的plot()函数用于创建折线图。 语...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作