Android绘制曲线
ScriptGirl 人气:01、将jar包放到app下的libs文件夹中
2、build.gradle(app):
implementation files('libs\\hellocharts-library-1.5.8.jar')
3、MainActivity.java
package com.dj.drawlinestest; import android.graphics.Color; import android.os.Bundle; import android.os.Handler; import android.view.View; import androidx.appcompat.app.AppCompatActivity; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.Random; import lecho.lib.hellocharts.gesture.ContainerScrollType; import lecho.lib.hellocharts.gesture.ZoomType; import lecho.lib.hellocharts.model.Axis; import lecho.lib.hellocharts.model.AxisValue; import lecho.lib.hellocharts.model.Line; import lecho.lib.hellocharts.model.LineChartData; import lecho.lib.hellocharts.model.PointValue; import lecho.lib.hellocharts.model.ValueShape; import lecho.lib.hellocharts.model.Viewport; import lecho.lib.hellocharts.view.LineChartView; public class MainActivity extends AppCompatActivity { LineChartView lineChart; Random mRandom; Handler mHandler; MyRunnable mRunnable; DrawLinesUtil mDrawLinesUtil; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mRandom = new Random(); lineChart = findViewById(R.id.LineChart); mDrawLinesUtil = new DrawLinesUtil(lineChart); mRunnable = new MyRunnable(); mHandler = new Handler(); mHandler.postDelayed(mRunnable, 0); } private class MyRunnable implements Runnable { @Override public void run() { Integer number = Math.abs(mRandom.nextInt()) % 50 + 50; mDrawLinesUtil.updateLocNumList(number); mDrawLinesUtil.display_chart(); mHandler.postDelayed(this, 1000); } } }
4、activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <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" android:orientation="vertical" tools:context=".MainActivity"> <lecho.lib.hellocharts.view.LineChartView android:id="@+id/LineChart" android:layout_width="match_parent" android:layout_height="500dp" android:layout_alignParentStart="true" android:layout_alignParentTop="true" android:alpha="0.6"></lecho.lib.hellocharts.view.LineChartView> </LinearLayout>
5、工具类:
DrawLinesUtil.java
package com.dj.drawlinestest; import android.graphics.Color; import android.view.View; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import lecho.lib.hellocharts.gesture.ContainerScrollType; import lecho.lib.hellocharts.gesture.ZoomType; import lecho.lib.hellocharts.model.Axis; import lecho.lib.hellocharts.model.AxisValue; import lecho.lib.hellocharts.model.Line; import lecho.lib.hellocharts.model.LineChartData; import lecho.lib.hellocharts.model.PointValue; import lecho.lib.hellocharts.model.ValueShape; import lecho.lib.hellocharts.model.Viewport; import lecho.lib.hellocharts.view.LineChartView; public class DrawLinesUtil { LineChartView lineChart; private boolean inited; private int pointNumber; private List<PointValue> mPointValues ; private List<AxisValue> mAxisXValues ; private List<Integer> mLocNumList ; /** * 构造函数 * @param lineChart */ public DrawLinesUtil(LineChartView lineChart) { this.lineChart = lineChart; this.inited = false; this.pointNumber = 60; // +默认显示60个点 this.mPointValues = new ArrayList<>(); // 数据点 this.mAxisXValues = new ArrayList<>(); // X轴标注 this.mLocNumList = new LinkedList<>(); // 数据源 } /** * set get * @return */ public int getPointNumber() { return pointNumber; } public void setPointNumber(int pointNumber) { this.pointNumber = pointNumber; } public LineChartView getLineChart() { return lineChart; } public void setLineChart(LineChartView lineChart) { this.lineChart = lineChart; } public List<Integer> getLocNumList() { return mLocNumList; } /** * 供外部调用 添加数据 * @param number */ public void updateLocNumList(Integer number){ if (mLocNumList.size() >= pointNumber) { mLocNumList.remove(0); } mLocNumList.add(number); } /** * 供外部调用 画曲线 */ public void display_chart() { if( ! inited ){ setAttribute(); } getXLables(); getPoints(); draw_linechart(); } /** * 设置行为属性,支持缩放、滑动以及平移 */ private void setAttribute(){ lineChart.setInteractive(true); lineChart.setZoomType(ZoomType.HORIZONTAL); lineChart.setMaxZoom((float) 2);//最大方法比例 lineChart.setContainerScrollEnabled(true, ContainerScrollType.HORIZONTAL); lineChart.setVisibility(View.GONE); inited = true; } /** * 设置X轴的显示 */ private void getXLables(){ mAxisXValues.clear(); for (int i = 0; i < mLocNumList.size(); i++) { mAxisXValues.add(new AxisValue(i).setLabel(""));//这里设置x轴的内容 } } /** * 图表的每个点的显示 */ private void getPoints() { mPointValues.clear(); //Log.v(TAG,"getPoints"+mLocNumList.size()); for (int i = 0; i < mLocNumList.size(); i++) { mPointValues.add(new PointValue(i, mLocNumList.get(i))); } } /** * 内部方法 画曲线 */ private void draw_linechart(){ Line line = new Line(mPointValues).setColor(Color.parseColor("#FFCD41"));//("#FFCD41")); //折线的颜色(橙色) List<Line> lines = new ArrayList<>(); line.setShape(ValueShape.CIRCLE);//折线图上每个数据点的形状 这里是圆形 (有三种 :ValueShape.SQUARE ValueShape.CIRCLE ValueShape.DIAMOND) line.setCubic(true);//曲线是否平滑,即是曲线还是折线 line.setFilled(true);//是否填充曲线的面积 line.setHasLabels(false);//曲线的数据坐标是否加上备注 line.setHasLabelsOnlyForSelected(true);//点击数据坐标提示数据(设置了这个line.setHasLabels(true);就无效) line.setHasLines(true);//是否用线显示。如果为false 则没有曲线只有点显示 line.setHasPoints(true);//是否显示圆点 如果为false 则没有原点只有点显示(每个数据点都是个大的圆点) line.setPointRadius(3); lines.add(line); LineChartData data = new LineChartData(); data.setLines(lines); //坐标轴 Axis axisX = new Axis(); //X轴 axisX.setTextSize(0);//设置字体大小 //axisX.setMaxLabelChars(20); //最多几个X轴坐标,意思就是你的缩放让X轴上数据的个数7<=x<=mAxisXValues.length axisX.setValues(mAxisXValues); //填充X轴的坐标名称 data.setAxisXBottom(axisX); //x 轴在底部 //data.setAxisXTop(axisX); //x 轴在顶部 // axisX.setHasLines(true); //x 轴分割线 // Y轴是根据数据的大小自动设置Y轴上限(在下面我会给出固定Y轴数据个数的解决方案) Axis axisY = new Axis(); //Y轴 axisY.setName("");//y轴标注 axisY.setTextSize(8);//设置字体大小 data.setAxisYLeft(axisY); //Y轴设置在左边 //axisY.setHasLines(true); //Y轴分割线 //设置行为属性,支持缩放、滑动以及平移 lineChart.setInteractive(true); lineChart.setZoomType(ZoomType.HORIZONTAL); lineChart.setMaxZoom((float) 2);//最大方法比例 lineChart.setContainerScrollEnabled(true, ContainerScrollType.HORIZONTAL); lineChart.setLineChartData(data); lineChart.setVisibility(View.VISIBLE); Viewport v2 = new Viewport(lineChart.getMaximumViewport()); v2.top = 100; v2.bottom = 0; if (mLocNumList.size()>24) { lineChart.setMaximumViewport(v2); Viewport v = new Viewport(lineChart.getMaximumViewport()); v.left = mLocNumList.size() - 24-1; lineChart.setCurrentViewport(v); }else { v2.right = 24; lineChart.setMaximumViewport(v2); lineChart.setCurrentViewport(v2); } } }
加载全部内容