• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
2 package com.xxmassdeveloper.mpchartexample;
3 
4 import android.Manifest;
5 import android.content.Intent;
6 import android.content.pm.PackageManager;
7 import android.graphics.Color;
8 import android.net.Uri;
9 import android.os.Bundle;
10 import androidx.core.content.ContextCompat;
11 import android.view.Menu;
12 import android.view.MenuItem;
13 import android.view.WindowManager;
14 import android.widget.Toast;
15 
16 import com.github.mikephil.charting.charts.LineChart;
17 import com.github.mikephil.charting.components.YAxis.AxisDependency;
18 import com.github.mikephil.charting.data.Entry;
19 import com.github.mikephil.charting.data.LineData;
20 import com.github.mikephil.charting.data.LineDataSet;
21 import com.github.mikephil.charting.highlight.Highlight;
22 import com.github.mikephil.charting.interfaces.datasets.ILineDataSet;
23 import com.github.mikephil.charting.listener.OnChartValueSelectedListener;
24 import com.github.mikephil.charting.utils.ColorTemplate;
25 import com.xxmassdeveloper.mpchartexample.notimportant.DemoBase;
26 
27 import java.util.ArrayList;
28 
29 public class DynamicalAddingActivity extends DemoBase implements OnChartValueSelectedListener {
30 
31     private LineChart chart;
32 
33     @Override
onCreate(Bundle savedInstanceState)34     protected void onCreate(Bundle savedInstanceState) {
35         super.onCreate(savedInstanceState);
36         getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
37                 WindowManager.LayoutParams.FLAG_FULLSCREEN);
38         setContentView(R.layout.activity_linechart_noseekbar);
39 
40         setTitle("DynamicalAddingActivity");
41 
42         chart = findViewById(R.id.chart1);
43         chart.setOnChartValueSelectedListener(this);
44         chart.setDrawGridBackground(false);
45         chart.getDescription().setEnabled(false);
46         chart.setNoDataText("No chart data available. Use the menu to add entries and data sets!");
47 
48 //        chart.getXAxis().setDrawLabels(false);
49 //        chart.getXAxis().setDrawGridLines(false);
50 
51         chart.invalidate();
52     }
53 
54     private final int[] colors = ColorTemplate.VORDIPLOM_COLORS;
55 
addEntry()56     private void addEntry() {
57 
58         LineData data = chart.getData();
59 
60         if (data == null) {
61             data = new LineData();
62             chart.setData(data);
63         }
64 
65         ILineDataSet set = data.getDataSetByIndex(0);
66         // set.addEntry(...); // can be called as well
67 
68         if (set == null) {
69             set = createSet();
70             data.addDataSet(set);
71         }
72 
73         // choose a random dataSet
74         int randomDataSetIndex = (int) (Math.random() * data.getDataSetCount());
75         ILineDataSet randomSet = data.getDataSetByIndex(randomDataSetIndex);
76         float value = (float) (Math.random() * 50) + 50f * (randomDataSetIndex + 1);
77 
78         data.addEntry(new Entry(randomSet.getEntryCount(), value), randomDataSetIndex);
79         data.notifyDataChanged();
80 
81         // let the chart know it's data has changed
82         chart.notifyDataSetChanged();
83 
84         chart.setVisibleXRangeMaximum(6);
85         //chart.setVisibleYRangeMaximum(15, AxisDependency.LEFT);
86 //
87 //            // this automatically refreshes the chart (calls invalidate())
88         chart.moveViewTo(data.getEntryCount() - 7, 50f, AxisDependency.LEFT);
89 
90     }
91 
removeLastEntry()92     private void removeLastEntry() {
93 
94         LineData data = chart.getData();
95 
96         if (data != null) {
97 
98             ILineDataSet set = data.getDataSetByIndex(0);
99 
100             if (set != null) {
101 
102                 Entry e = set.getEntryForXValue(set.getEntryCount() - 1, Float.NaN);
103 
104                 data.removeEntry(e, 0);
105                 // or remove by index
106                 // mData.removeEntryByXValue(xIndex, dataSetIndex);
107                 data.notifyDataChanged();
108                 chart.notifyDataSetChanged();
109                 chart.invalidate();
110             }
111         }
112     }
113 
addDataSet()114     private void addDataSet() {
115 
116         LineData data = chart.getData();
117 
118         if (data == null) {
119             chart.setData(new LineData());
120         } else {
121             int count = (data.getDataSetCount() + 1);
122             int amount = data.getDataSetByIndex(0).getEntryCount();
123 
124             ArrayList<Entry> values = new ArrayList<>();
125 
126             for (int i = 0; i < amount; i++) {
127                 values.add(new Entry(i, (float) (Math.random() * 50f) + 50f * count));
128             }
129 
130             LineDataSet set = new LineDataSet(values, "DataSet " + count);
131             set.setLineWidth(2.5f);
132             set.setCircleRadius(4.5f);
133 
134             int color = colors[count % colors.length];
135 
136             set.setColor(color);
137             set.setCircleColor(color);
138             set.setHighLightColor(color);
139             set.setValueTextSize(10f);
140             set.setValueTextColor(color);
141 
142             data.addDataSet(set);
143             data.notifyDataChanged();
144             chart.notifyDataSetChanged();
145             chart.invalidate();
146         }
147     }
148 
removeDataSet()149     private void removeDataSet() {
150 
151         LineData data = chart.getData();
152 
153         if (data != null) {
154 
155             data.removeDataSet(data.getDataSetByIndex(data.getDataSetCount() - 1));
156 
157             chart.notifyDataSetChanged();
158             chart.invalidate();
159         }
160     }
161 
createSet()162     private LineDataSet createSet() {
163 
164         LineDataSet set = new LineDataSet(null, "DataSet 1");
165         set.setLineWidth(2.5f);
166         set.setCircleRadius(4.5f);
167         set.setColor(Color.rgb(240, 99, 99));
168         set.setCircleColor(Color.rgb(240, 99, 99));
169         set.setHighLightColor(Color.rgb(190, 190, 190));
170         set.setAxisDependency(AxisDependency.LEFT);
171         set.setValueTextSize(10f);
172 
173         return set;
174     }
175 
176     @Override
onValueSelected(Entry e, Highlight h)177     public void onValueSelected(Entry e, Highlight h) {
178         Toast.makeText(this, e.toString(), Toast.LENGTH_SHORT).show();
179     }
180 
181     @Override
onNothingSelected()182     public void onNothingSelected() {}
183 
184     @Override
onCreateOptionsMenu(Menu menu)185     public boolean onCreateOptionsMenu(Menu menu) {
186         getMenuInflater().inflate(R.menu.dynamical, menu);
187         return true;
188     }
189 
190     @Override
onOptionsItemSelected(MenuItem item)191     public boolean onOptionsItemSelected(MenuItem item) {
192 
193         switch (item.getItemId()) {
194             case R.id.viewGithub: {
195                 Intent i = new Intent(Intent.ACTION_VIEW);
196                 i.setData(Uri.parse("https://github.com/PhilJay/MPAndroidChart/blob/master/MPChartExample/src/com/xxmassdeveloper/mpchartexample/DynamicalAddingActivity.java"));
197                 startActivity(i);
198                 break;
199             }
200             case R.id.actionAddEntry: {
201                 addEntry();
202                 Toast.makeText(this, "Entry added!", Toast.LENGTH_SHORT).show();
203                 break;
204             }
205             case R.id.actionRemoveEntry: {
206                 removeLastEntry();
207                 Toast.makeText(this, "Entry removed!", Toast.LENGTH_SHORT).show();
208                 break;
209             }
210             case R.id.actionAddDataSet: {
211                 addDataSet();
212                 Toast.makeText(this, "DataSet added!", Toast.LENGTH_SHORT).show();
213                 break;
214             }
215             case R.id.actionRemoveDataSet: {
216                 removeDataSet();
217                 Toast.makeText(this, "DataSet removed!", Toast.LENGTH_SHORT).show();
218                 break;
219             }
220             case R.id.actionClear: {
221                 chart.clear();
222                 Toast.makeText(this, "Chart cleared!", Toast.LENGTH_SHORT).show();
223                 break;
224             }
225             case R.id.actionSave: {
226                 if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
227                     saveToGallery();
228                 } else {
229                     requestStoragePermission(chart);
230                 }
231                 break;
232             }
233         }
234 
235         return true;
236     }
237 
238     @Override
saveToGallery()239     protected void saveToGallery() {
240         saveToGallery(chart, "DynamicalAddingActivity");
241     }
242 }
243