首頁 > 軟體

Android畫圖實現MPAndroidchart折線圖範例詳解

2022-07-27 22:04:46

效果圖

  • 用的是3.1.0的依賴

依賴

    allprojects {
        repositories {
            jcenter()
            maven { url "https://jitpack.io" }
        }
    }
 //依賴
dependencies{
 implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
}

activity.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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=".MainActivity">
    <com.github.mikephil.charting.charts.LineChart
        android:id="@+id/lineChart"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#ffffff"
        android:layout_margin="15dp"/>
</RelativeLayout>

MainActivity

  private LineChart lineChart;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
         lineChart = (LineChart) findViewById(R.id.lineChart);
        //建立描述資訊
        Description description = new Description();
        description.setText("測試圖表");
        description.setTextColor(Color.RED);
        description.setTextSize(20);
        lineChart.setDescription(description);//設定圖表描述資訊
        lineChart.setNoDataText("沒有資料哦");//沒有資料時顯示的文字
        lineChart.setNoDataTextColor(Color.BLUE);//沒有資料時顯示文字的顏色
        lineChart.setDrawGridBackground(false);//chart 繪圖區後面的背景矩形將繪製
        lineChart.setDrawBorders(false);//禁止繪製圖表邊框的線
        //lineChart.setBorderColor(); //設定 chart 邊框線的顏色。
        //lineChart.setBorderWidth(); //設定 chart 邊界線的寬度,單位 dp。
        //lineChart.setLogEnabled(true);//列印紀錄檔
        //lineChart.notifyDataSetChanged();//重新整理資料
        //lineChart.invalidate();//重繪
        initDate();
        initXY();
    }
private void initDate() {
        /**
         * Entry 座標點物件  建構函式 第一個引數為x點座標 第二個為y點
         */
        ArrayList<Entry> values1 = new ArrayList<>();
        ArrayList<Entry> values2 = new ArrayList<>();
        values1.add(new Entry(1, 10));
        values1.add(new Entry(2, 15));
        values1.add(new Entry(3, 20));
        values1.add(new Entry(4, 5));
        values1.add(new Entry(5, 30));
        values1.add(new Entry(6, 15));
        values1.add(new Entry(7, 6));
        values2.add(new Entry(1, 20));
        values2.add(new Entry(2, 15));
        values2.add(new Entry(3, 13));
        values2.add(new Entry(4, 8));
        values2.add(new Entry(5, 9));
        values2.add(new Entry(6, 12));
        values2.add(new Entry(7, 15));
        //LineDataSet每一個物件就是一條連線線
        LineDataSet set1;
        LineDataSet set2;
//設定圖例
//獲取圖例
Legend legend=mChart.getLegend();
//是否開啟設定圖例
legend.setEnabled(true);
//設定圖例文字大小
legend.setTextSize(50f);
//設定圖例文字顏色
legend.setTextColor(Color.BLUE);
//如果設定為true,那麼當圖例過多或者過長一行顯示不下的時候就會自適應換行
legend.setWordWrapEnabled(true);
//設定表格的最大相對大小,預設為0.95f(95%)
legend.setMaxSizePercent(0.95f);
//設定圖例位置
legend.setPosition(Legend.LegendPosition.ABOVE_CHART_LEFT);
//設定圖例形狀:如SQUARE、CIRCLE、LINE、DEFAULT
legend.setForm(Legend.LegendForm.CIRCLE);
//設定圖例XY方向的間隔寬度
legend.setXEntrySpace(20f);
legend.setYEntrySpace(20f);
//設定圖例標籤到文字之間的距離
legend.setFormToTextSpace(20f);
//設定文字包裝
legend.setWordWrapEnabled(true);
        //判斷圖表中原來是否有資料
        if (lineChart.getData() != null && lineChart.getData().getDataSetCount() > 0) {
            //獲取資料1
            set1 = (LineDataSet) lineChart.getData().getDataSetByIndex(0);
            set1.setValues(values1);
            set2 = (LineDataSet) lineChart.getData().getDataSetByIndex(1);
            set2.setValues(values2);
            //重新整理資料
            lineChart.getData().notifyDataChanged();
            lineChart.notifyDataSetChanged();
        } else {
            //設定資料1  引數1:資料來源 引數2:圖例名稱setValueFormatter
            set1 = new LineDataSet(values1, "測試資料1");
            set1.setColor(Color.BLUE);//兩個點之間的距離連線線
            set1.setCircleColor(Color.WHITE);//資料展示的圓點顏色
            set1.setLineWidth(3f);//設定線寬
            set1.setCircleRadius(3f);//設定焦點圓心的大小
            set1.enableDashedHighlightLine(2f, 5f, 0f);//點選後的高亮線的顯示樣式
            set1.setHighlightLineWidth(1f);//設定點選交點後顯示高亮線寬
            set1.setHighlightEnabled(true);//是否禁用點選高亮線
            set1.setHighLightColor(Color.YELLOW);//設定點選交點後顯示交高亮線的顏色
            set1.setValueTextSize(9f);//設定顯示值的文字大小
            set1.setMode(LineDataSet.Mode.CUBIC_BEZIER);//直線 變成 曲線
            set1.setDrawValues(false);  //不顯示數值
//            set1.setValueFormatter(new LargeValueFormatter("℃"));//顯示數值的樣式
            //陰影填充
//            set1.setDrawFilled(true);//設定禁用範圍背景填充 陰影
//            set1.setFillDrawable(getResources().getDrawable(R.drawable.line_gradient_bg_shape));
            //設定資料2
            set2 = new LineDataSet(values2, "測試資料2");
            set2.setColor(Color.GRAY);//兩個點之間的距離連線線
            set2.setCircleColor(Color.WHITE);//資料展示的圓點顏色
            set2.setLineWidth(3f);//設定線寬
            set2.setCircleRadius(3f);//設定焦點圓心的大小
            set2.enableDashedHighlightLine(2f, 5f, 0f);//點選後的高亮線的顯示樣式
            set2.setHighlightLineWidth(1f);//設定點選交點後顯示高亮線寬
            set2.setHighlightEnabled(true);//是否禁用點選高亮線
            set2.setHighLightColor(Color.YELLOW);//設定點選交點後顯示交高亮線的顏色
            set2.setValueTextSize(9f);//設定顯示值的文字大小
            set2.setMode(LineDataSet.Mode.CUBIC_BEZIER);//直線 變成 曲線
            set2.setDrawValues(false);  //不顯示數值
            //陰影填充
//            set2.setDrawFilled(true);//設定禁用範圍背景填充 陰影
//            set2.setFillDrawable(getResources().getDrawable(R.drawable.line_gradient_bg_shape2));
            //儲存LineDataSet集合
            ArrayList<ILineDataSet> dataSets = new ArrayList<>();
            dataSets.add(set1); // 新增資料集
            dataSets.add(set2);// 新增資料集
            //建立LineData物件 屬於LineChart折線圖的資料集合
            LineData data = new LineData(dataSets);
            // 新增到圖表中
            lineChart.setData(data);
            //繪製圖表
            lineChart.invalidate();
        }
    }
   private void initXY() {
        ArrayList<String> xvalue=new ArrayList<>();//x軸時間
        xvalue.add("10-1");//當然這樣可以把X軸的資料隨便設定成啥都行。
        xvalue.add("10-2");
        xvalue.add("10-3");
        xvalue.add("10-4");
        xvalue.add("10-5");
        xvalue.add("10-6");
        xvalue.add("10-7");
        //獲取此圖表的x軸
        XAxis xAxis = lineChart.getXAxis();
        xAxis.setEnabled(true);//設定軸啟用或禁用 如果禁用以下的設定全部不生效
        xAxis.setDrawAxisLine(true);//是否繪製軸線
        xAxis.setDrawGridLines(true);//設定x軸上每個點對應的線
        xAxis.setDrawLabels(true);//繪製標籤  指x軸上的對應數值
        xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);//設定x軸的顯示位置
        xAxis.setGranularity(1);//讓x軸上自定義的值和折線上相對應
        xAxis.setAxisLineColor(R.color.white);//設定橫軸線的顏色
        xAxis.setTextColor(R.color.white);//設定橫軸字型顏色
        xAxis.setValueFormatter(new ValueFormatter() {
            @Override
            public String getAxisLabel(float value, AxisBase axis) {
                return xvalue.get((int) value - 1);
            }
        });
//        xAxis.setLabelsToSkip(0);
        //xAxis.setTextSize(20f);//設定字型
        //xAxis.setTextColor(Color.BLACK);//設定字型顏色
        //設定豎線的顯示樣式為虛線
        //lineLength控制虛線段的長度
        //spaceLength控制線之間的空間
//        xAxis.enableGridDashedLine(0f, 0f, 0f);
//        xAxis.setAxisMinimum(0f);//設定x軸的最小值
//        xAxis.setAxisMaximum(10f);//設定最大值
//        xAxis.setAvoidFirstLastClipping(true);//圖表將避免第一個和最後一個標籤條目被減掉在圖表或螢幕的邊緣
//        xAxis.setLabelRotationAngle(0f);//設定x軸標籤的旋轉角度
//        設定x軸顯示標籤數量  還有一個過載方法第二個引數為布林值強制設定數量 如果啟用會導致繪製點出現偏差
//        xAxis.setLabelCount(10);
//        xAxis.setTextColor(Color.BLUE);//設定軸標籤的顏色
//        xAxis.setTextSize(24f);//設定軸標籤的大小
//        xAxis.setGridLineWidth(10f);//設定豎線大小
//        xAxis.setGridColor(Color.RED);//設定豎線顏色
//        xAxis.setAxisLineColor(Color.GREEN);//設定x軸線顏色
//        xAxis.setAxisLineWidth(5f);//設定x軸線寬度
//        xAxis.setValueFormatter();//格式化x軸標籤顯示字元
        /**
         * Y軸預設顯示左右兩個軸線
         */
        //獲取右邊的軸線
        YAxis rightAxis=lineChart.getAxisRight();
        //設定圖表右邊的y軸禁用
        rightAxis.setEnabled(false);
        //獲取左邊的軸線
        YAxis leftAxis = lineChart.getAxisLeft();
        //設定格線為虛線效果
        leftAxis.enableGridDashedLine(0f, 0f, 0f);
        //是否繪製0所在的格線
        leftAxis.setDrawZeroLine(false);
        leftAxis.setEnabled(true);//設定軸啟用或禁用 如果禁用以下的設定全部不生效
        leftAxis.setDrawAxisLine(true);//是否繪製軸線
        leftAxis.setDrawGridLines(true);//設定x軸上每個點對應的線
        leftAxis.setDrawLabels(true);//繪製標籤  指x軸上的對應數值
        leftAxis.setGranularity(1);//讓y軸上自定義的值和折線上相對應
        leftAxis.setAxisLineColor(R.color.white);//設定縱軸線的顏色
        leftAxis.setTextColor(R.color.white);    //設定縱軸字型顏色
        lineChart.setTouchEnabled(true); // 設定是否可以觸控
        lineChart.setDragEnabled(false); // 是否可以拖拽
        lineChart.setScaleEnabled(false);// 是否可以縮放 x和y軸, 預設是true
        lineChart.setScaleXEnabled(false); //是否可以縮放 僅x軸
        lineChart.setScaleYEnabled(false); //是否可以縮放 僅y軸
        lineChart.setPinchZoom(false);  //設定x軸和y軸能否同時縮放。預設是否
        lineChart.setDoubleTapToZoomEnabled(false);//設定是否可以通過雙擊螢幕放大圖表。預設是true
        lineChart.setHighlightPerDragEnabled(true);//能否拖拽高亮線(資料點與座標的提示線),預設是true
        lineChart.setDragDecelerationEnabled(false);//拖拽捲動時,手放開是否會持續捲動,預設是true(false是拖到哪是哪,true拖拽之後還會有緩衝)
        lineChart.setDragDecelerationFrictionCoef(0.99f);//與上面那個屬性配合,持續捲動時的速度快慢,[0,1) 0代表立即停止。
        lineChart.getXAxis().setDrawGridLines(false);//設定格線
        lineChart.getAxisLeft().setDrawGridLines(false);//去掉左右邊線
        lineChart.getAxisRight().setDrawGridLines(false);//去掉左右邊線
        final MarkerViews mv = new MarkerViews(this, R.layout.maekertextview,lineChart,xvalue);
        mv.setChartView(lineChart);
        // set the marker to the chart
        lineChart.setMarker(mv);
        //自定義的MarkerView物件
//        MyMarkerView mv = new MyMarkerView(this, R.layout.item);
//        mv.setChartView(lineChart);
//        lineChart.setMarker(mv);
    }

MyMarkerView 自定義class

public class MarkerViews extends MarkerView {
    private TextView tvContent;//自己定義的xmL
    LineChart lineChart;//圖表控制元件
    ArrayList<String> xvalue;//X軸資料來源
    /**
     * Constructor. Sets up the MarkerView with a custom layout resource.
     *
     * @param context
     * @param layoutResource the layout resource to use for the MarkerView
     */
    public MarkerViews(Context context, int layoutResource, LineChart lineChart,ArrayList<String> xvalue) {
        super(context,layoutResource);
        tvContent = (TextView) findViewById(R.id.tvContent1);
        this.lineChart=lineChart;
        this.xvalue=xvalue;
    }
    @Override
    public void refreshContent(Entry e, Highlight highlight) {//重寫refreshContent方法(注意,在  //MPAndroidChart早期版本里這裡有三個引數,這裡有兩個,我這是MPAndroidChart 3.0.2版本
        //下面這裡是關鍵的
        LineData lineData=lineChart.getLineData();//得到已經繪製成型的折線圖的資料
        LineDataSet set=(LineDataSet)lineData.getDataSetByIndex(0);//獲取第一條折線圖Y軸資料
        LineDataSet set1=(LineDataSet)lineData.getDataSetByIndex(1);//獲取第二條折線圖Y軸資料
        int DataSetIndex=highlight.getDataSetIndex();//獲取點選的是哪條折線上的交叉點,0就是第一條,以此類推
        int index;
        if (DataSetIndex==0){
            index= set.getEntryIndex(e);//根據點選的該條折線的點,獲取當前Y軸資料對應的index值,
        }else {
            index= set1.getEntryIndex(e);//根據點選的該條折線的點,獲取當前Y軸資料對應的index值,
        }
        //根據index值,分別獲取當前X軸上對應的兩條折線的Y軸的值
        Log.i("x,y軸","/"+xvalue.get(index)+"/"+e.getY());
        tvContent.setText("時間:"+xvalue.get(index)+"n線上人數:"+e.getY());
        super.refreshContent(e, highlight);
    }
    @Override
    public MPPointF getOffset() {
        return new MPPointF(-(getWidth() / 2), -getHeight());
    }
}

maekertextview .xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@color/white"
    >
    <TextView
        android:id="@+id/tvContent1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="7dp"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="5dp"
        android:text=""
        android:singleLine="false"
        android:textSize="12dp"
        android:textColor="@android:color/black"
        android:textAppearance="?android:attr/textAppearanceSmall" />
</RelativeLayout>

常用屬性

  • setDescription(String desc) : 設定表格的描述
  • setDescriptionTypeface(Typeface t) :自定義表格中顯示的字型
  • setDrawYValues(boolean enabled) : 設定是否顯示y軸的值的資料
  • setValuePaintColor(int color) :設定表格中y軸的值的顏色,但是必須設定setDrawYValues(true)
  • setValueTypeface(Typeface t):設定字型
  • setValueFormatter(DecimalFormat format) : 設定顯示的格式
  • setPaint(Paint p, int which) : 自定義筆刷
  • public ChartData getDataCurrent() :返回ChartData物件當前顯示的圖表。它包含了所有資訊的顯示值最小和最大值等
  • public float getYChartMin() : 返回當前最小值
  • public float getYChartMax() : 返回當前最大值
  • public float getAverage() : 返回所有值的平均值。
  • public float getAverage(int type) : 返回平均值
  • public PointF getCenter() : 返回中間點
  • public Paint getPaint(int which) : 得到筆刷
  • setTouchEnabled(boolean enabled) : 設定是否可以觸控,如為false,則不能拖動,縮放等
  • setDragScaleEnabled(boolean enabled) : 設定是否可以拖拽,縮放
  • setOnChartValueSelectedListener(OnChartValueSelectedListener l) : 設定表格上的點,被點選的時候,的回撥函數
  • setHighlightEnabled(boolean enabled) : 設定點選value的時候,是否高亮顯示
  • public void highlightValues(Highlight[] highs) : 設定高亮顯示
  • saveToGallery(String title) : 儲存圖表到相簿中
  • saveToPath(String title, String pathOnSD) : 儲存.
  • setScaleMinima(float x, float y) : 設定最小的縮放
  • centerViewPort(int xIndex, float val) : 設定視口
  • fitScreen() : 適應螢幕

以上就是Android畫圖實現MPAndroidchart折線圖範例詳解的詳細內容,更多關於Android MPAndroidchart折線圖的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com