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.net.Uri; 8 import android.os.Bundle; 9 import androidx.core.content.ContextCompat; 10 import android.view.Menu; 11 import android.view.MenuItem; 12 import android.view.WindowManager; 13 import android.widget.SeekBar; 14 import android.widget.SeekBar.OnSeekBarChangeListener; 15 import android.widget.TextView; 16 17 import com.github.mikephil.charting.charts.BarChart; 18 import com.github.mikephil.charting.components.XAxis; 19 import com.github.mikephil.charting.components.XAxis.XAxisPosition; 20 import com.github.mikephil.charting.data.BarData; 21 import com.github.mikephil.charting.data.BarDataSet; 22 import com.github.mikephil.charting.data.BarEntry; 23 import com.github.mikephil.charting.interfaces.datasets.IBarDataSet; 24 import com.github.mikephil.charting.interfaces.datasets.IDataSet; 25 import com.github.mikephil.charting.utils.ColorTemplate; 26 import com.xxmassdeveloper.mpchartexample.notimportant.DemoBase; 27 28 import java.util.ArrayList; 29 30 public class AnotherBarActivity extends DemoBase implements OnSeekBarChangeListener { 31 32 private BarChart chart; 33 private SeekBar seekBarX, seekBarY; 34 private TextView tvX, tvY; 35 36 @Override onCreate(Bundle savedInstanceState)37 protected void onCreate(Bundle savedInstanceState) { 38 super.onCreate(savedInstanceState); 39 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 40 WindowManager.LayoutParams.FLAG_FULLSCREEN); 41 setContentView(R.layout.activity_barchart); 42 43 setTitle("AnotherBarActivity"); 44 45 tvX = findViewById(R.id.tvXMax); 46 tvY = findViewById(R.id.tvYMax); 47 48 seekBarX = findViewById(R.id.seekBar1); 49 seekBarX.setOnSeekBarChangeListener(this); 50 51 seekBarY = findViewById(R.id.seekBar2); 52 seekBarY.setOnSeekBarChangeListener(this); 53 54 chart = findViewById(R.id.chart1); 55 56 chart.getDescription().setEnabled(false); 57 58 // if more than 60 entries are displayed in the chart, no values will be 59 // drawn 60 chart.setMaxVisibleValueCount(60); 61 62 // scaling can now only be done on x- and y-axis separately 63 chart.setPinchZoom(false); 64 65 chart.setDrawBarShadow(false); 66 chart.setDrawGridBackground(false); 67 68 XAxis xAxis = chart.getXAxis(); 69 xAxis.setPosition(XAxisPosition.BOTTOM); 70 xAxis.setDrawGridLines(false); 71 72 chart.getAxisLeft().setDrawGridLines(false); 73 74 // setting data 75 seekBarX.setProgress(10); 76 seekBarY.setProgress(100); 77 78 // add a nice and smooth animation 79 chart.animateY(1500); 80 81 chart.getLegend().setEnabled(false); 82 } 83 84 @Override onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)85 public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 86 87 tvX.setText(String.valueOf(seekBarX.getProgress())); 88 tvY.setText(String.valueOf(seekBarY.getProgress())); 89 90 ArrayList<BarEntry> values = new ArrayList<>(); 91 92 for (int i = 0; i < seekBarX.getProgress(); i++) { 93 float multi = (seekBarY.getProgress() + 1); 94 float val = (float) (Math.random() * multi) + multi / 3; 95 values.add(new BarEntry(i, val)); 96 } 97 98 BarDataSet set1; 99 100 if (chart.getData() != null && 101 chart.getData().getDataSetCount() > 0) { 102 set1 = (BarDataSet) chart.getData().getDataSetByIndex(0); 103 set1.setValues(values); 104 chart.getData().notifyDataChanged(); 105 chart.notifyDataSetChanged(); 106 } else { 107 set1 = new BarDataSet(values, "Data Set"); 108 set1.setColors(ColorTemplate.VORDIPLOM_COLORS); 109 set1.setDrawValues(false); 110 111 ArrayList<IBarDataSet> dataSets = new ArrayList<>(); 112 dataSets.add(set1); 113 114 BarData data = new BarData(dataSets); 115 chart.setData(data); 116 chart.setFitBars(true); 117 } 118 119 chart.invalidate(); 120 } 121 122 @Override onCreateOptionsMenu(Menu menu)123 public boolean onCreateOptionsMenu(Menu menu) { 124 getMenuInflater().inflate(R.menu.bar, menu); 125 menu.removeItem(R.id.actionToggleIcons); 126 return true; 127 } 128 129 @Override onOptionsItemSelected(MenuItem item)130 public boolean onOptionsItemSelected(MenuItem item) { 131 132 switch (item.getItemId()) { 133 case R.id.viewGithub: { 134 Intent i = new Intent(Intent.ACTION_VIEW); 135 i.setData(Uri.parse("https://github.com/PhilJay/MPAndroidChart/blob/master/MPChartExample/src/com/xxmassdeveloper/mpchartexample/AnotherBarActivity.java")); 136 startActivity(i); 137 break; 138 } 139 case R.id.actionToggleValues: { 140 141 for (IDataSet set : chart.getData().getDataSets()) 142 set.setDrawValues(!set.isDrawValuesEnabled()); 143 144 chart.invalidate(); 145 break; 146 } 147 /* 148 case R.id.actionToggleIcons: { break; } 149 */ 150 case R.id.actionToggleHighlight: { 151 152 if(chart.getData() != null) { 153 chart.getData().setHighlightEnabled(!chart.getData().isHighlightEnabled()); 154 chart.invalidate(); 155 } 156 break; 157 } 158 case R.id.actionTogglePinch: { 159 if (chart.isPinchZoomEnabled()) 160 chart.setPinchZoom(false); 161 else 162 chart.setPinchZoom(true); 163 164 chart.invalidate(); 165 break; 166 } 167 case R.id.actionToggleAutoScaleMinMax: { 168 chart.setAutoScaleMinMaxEnabled(!chart.isAutoScaleMinMaxEnabled()); 169 chart.notifyDataSetChanged(); 170 break; 171 } 172 case R.id.actionToggleBarBorders: { 173 for (IBarDataSet set : chart.getData().getDataSets()) 174 ((BarDataSet)set).setBarBorderWidth(set.getBarBorderWidth() == 1.f ? 0.f : 1.f); 175 176 chart.invalidate(); 177 break; 178 } 179 case R.id.animateX: { 180 chart.animateX(2000); 181 break; 182 } 183 case R.id.animateY: { 184 chart.animateY(2000); 185 break; 186 } 187 case R.id.animateXY: { 188 189 chart.animateXY(2000, 2000); 190 break; 191 } 192 case R.id.actionSave: { 193 if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { 194 saveToGallery(); 195 } else { 196 requestStoragePermission(chart); 197 } 198 break; 199 } 200 } 201 return true; 202 } 203 204 @Override saveToGallery()205 protected void saveToGallery() { 206 saveToGallery(chart, "AnotherBarActivity"); 207 } 208 209 @Override onStartTrackingTouch(SeekBar seekBar)210 public void onStartTrackingTouch(SeekBar seekBar) {} 211 212 @Override onStopTrackingTouch(SeekBar seekBar)213 public void onStopTrackingTouch(SeekBar seekBar) {} 214 } 215