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