• 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.net.Uri;
8 import android.os.Bundle;
9 import androidx.core.content.ContextCompat;
10 import android.util.Log;
11 import android.view.Menu;
12 import android.view.MenuItem;
13 import android.view.WindowManager;
14 import android.widget.SeekBar;
15 import android.widget.SeekBar.OnSeekBarChangeListener;
16 import android.widget.TextView;
17 
18 import com.github.mikephil.charting.charts.ScatterChart;
19 import com.github.mikephil.charting.components.Legend;
20 import com.github.mikephil.charting.components.XAxis;
21 import com.github.mikephil.charting.components.YAxis;
22 import com.github.mikephil.charting.data.Entry;
23 import com.github.mikephil.charting.data.ScatterData;
24 import com.github.mikephil.charting.data.ScatterDataSet;
25 import com.github.mikephil.charting.highlight.Highlight;
26 import com.github.mikephil.charting.interfaces.datasets.IScatterDataSet;
27 import com.github.mikephil.charting.listener.OnChartValueSelectedListener;
28 import com.github.mikephil.charting.utils.ColorTemplate;
29 import com.xxmassdeveloper.mpchartexample.custom.CustomScatterShapeRenderer;
30 import com.xxmassdeveloper.mpchartexample.notimportant.DemoBase;
31 
32 import java.util.ArrayList;
33 import java.util.List;
34 
35 public class ScatterChartActivity extends DemoBase implements OnSeekBarChangeListener,
36         OnChartValueSelectedListener {
37 
38     private ScatterChart chart;
39     private SeekBar seekBarX, seekBarY;
40     private TextView tvX, tvY;
41 
42     @Override
onCreate(Bundle savedInstanceState)43     protected void onCreate(Bundle savedInstanceState) {
44         super.onCreate(savedInstanceState);
45         getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
46                 WindowManager.LayoutParams.FLAG_FULLSCREEN);
47         setContentView(R.layout.activity_scatterchart);
48 
49         setTitle("ScatterChartActivity");
50 
51         tvX = findViewById(R.id.tvXMax);
52         tvY = findViewById(R.id.tvYMax);
53 
54         seekBarX = findViewById(R.id.seekBar1);
55         seekBarX.setOnSeekBarChangeListener(this);
56 
57         seekBarY = findViewById(R.id.seekBar2);
58         seekBarY.setOnSeekBarChangeListener(this);
59 
60         chart = findViewById(R.id.chart1);
61         chart.getDescription().setEnabled(false);
62         chart.setOnChartValueSelectedListener(this);
63 
64         chart.setDrawGridBackground(false);
65         chart.setTouchEnabled(true);
66         chart.setMaxHighlightDistance(50f);
67 
68         // enable scaling and dragging
69         chart.setDragEnabled(true);
70         chart.setScaleEnabled(true);
71 
72         chart.setMaxVisibleValueCount(200);
73         chart.setPinchZoom(true);
74 
75         seekBarX.setProgress(45);
76         seekBarY.setProgress(100);
77 
78         Legend l = chart.getLegend();
79         l.setVerticalAlignment(Legend.LegendVerticalAlignment.TOP);
80         l.setHorizontalAlignment(Legend.LegendHorizontalAlignment.RIGHT);
81         l.setOrientation(Legend.LegendOrientation.VERTICAL);
82         l.setDrawInside(false);
83         l.setTypeface(tfLight);
84         l.setXOffset(5f);
85 
86         YAxis yl = chart.getAxisLeft();
87         yl.setTypeface(tfLight);
88         yl.setAxisMinimum(0f); // this replaces setStartAtZero(true)
89 
90         chart.getAxisRight().setEnabled(false);
91 
92         XAxis xl = chart.getXAxis();
93         xl.setTypeface(tfLight);
94         xl.setDrawGridLines(false);
95     }
96 
97     @Override
onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)98     public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
99 
100         tvX.setText(String.valueOf(seekBarX.getProgress()));
101         tvY.setText(String.valueOf(seekBarY.getProgress()));
102 
103         ArrayList<Entry> values1 = new ArrayList<>();
104         ArrayList<Entry> values2 = new ArrayList<>();
105         ArrayList<Entry> values3 = new ArrayList<>();
106 
107         for (int i = 0; i < seekBarX.getProgress(); i++) {
108             float val = (float) (Math.random() * seekBarY.getProgress()) + 3;
109             values1.add(new Entry(i, val));
110         }
111 
112         for (int i = 0; i < seekBarX.getProgress(); i++) {
113             float val = (float) (Math.random() * seekBarY.getProgress()) + 3;
114             values2.add(new Entry(i+0.33f, val));
115         }
116 
117         for (int i = 0; i < seekBarX.getProgress(); i++) {
118             float val = (float) (Math.random() * seekBarY.getProgress()) + 3;
119             values3.add(new Entry(i+0.66f, val));
120         }
121 
122         // create a dataset and give it a type
123         ScatterDataSet set1 = new ScatterDataSet(values1, "DS 1");
124         set1.setScatterShape(ScatterChart.ScatterShape.SQUARE);
125         set1.setColor(ColorTemplate.COLORFUL_COLORS[0]);
126         ScatterDataSet set2 = new ScatterDataSet(values2, "DS 2");
127         set2.setScatterShape(ScatterChart.ScatterShape.CIRCLE);
128         set2.setScatterShapeHoleColor(ColorTemplate.COLORFUL_COLORS[3]);
129         set2.setScatterShapeHoleRadius(3f);
130         set2.setColor(ColorTemplate.COLORFUL_COLORS[1]);
131         ScatterDataSet set3 = new ScatterDataSet(values3, "DS 3");
132         set3.setShapeRenderer(new CustomScatterShapeRenderer());
133         set3.setColor(ColorTemplate.COLORFUL_COLORS[2]);
134 
135         set1.setScatterShapeSize(8f);
136         set2.setScatterShapeSize(8f);
137         set3.setScatterShapeSize(8f);
138 
139         ArrayList<IScatterDataSet> dataSets = new ArrayList<>();
140         dataSets.add(set1); // add the data sets
141         dataSets.add(set2);
142         dataSets.add(set3);
143 
144         // create a data object with the data sets
145         ScatterData data = new ScatterData(dataSets);
146         data.setValueTypeface(tfLight);
147 
148         chart.setData(data);
149         chart.invalidate();
150     }
151 
152     @Override
onCreateOptionsMenu(Menu menu)153     public boolean onCreateOptionsMenu(Menu menu) {
154         getMenuInflater().inflate(R.menu.scatter, menu);
155         return true;
156     }
157 
158     @Override
onOptionsItemSelected(MenuItem item)159     public boolean onOptionsItemSelected(MenuItem item) {
160 
161         switch (item.getItemId()) {
162             case R.id.viewGithub: {
163                 Intent i = new Intent(Intent.ACTION_VIEW);
164                 i.setData(Uri.parse("https://github.com/PhilJay/MPAndroidChart/blob/master/MPChartExample/src/com/xxmassdeveloper/mpchartexample/ScatterChartActivity.java"));
165                 startActivity(i);
166                 break;
167             }
168             case R.id.actionToggleValues: {
169                 List<IScatterDataSet> sets = chart.getData()
170                         .getDataSets();
171 
172                 for (IScatterDataSet iSet : sets) {
173 
174                     ScatterDataSet set = (ScatterDataSet) iSet;
175                     set.setDrawValues(!set.isDrawValuesEnabled());
176                 }
177 
178                 chart.invalidate();
179                 break;
180             }
181             case R.id.actionToggleHighlight: {
182                 if(chart.getData() != null) {
183                     chart.getData().setHighlightEnabled(!chart.getData().isHighlightEnabled());
184                     chart.invalidate();
185                 }
186                 break;
187             }
188             case R.id.actionTogglePinch: {
189                 if (chart.isPinchZoomEnabled())
190                     chart.setPinchZoom(false);
191                 else
192                     chart.setPinchZoom(true);
193 
194                 chart.invalidate();
195                 break;
196             }
197             case R.id.actionToggleAutoScaleMinMax: {
198                 chart.setAutoScaleMinMaxEnabled(!chart.isAutoScaleMinMaxEnabled());
199                 chart.notifyDataSetChanged();
200                 break;
201             }
202             case R.id.animateX: {
203                 chart.animateX(3000);
204                 break;
205             }
206             case R.id.animateY: {
207                 chart.animateY(3000);
208                 break;
209             }
210             case R.id.animateXY: {
211 
212                 chart.animateXY(3000, 3000);
213                 break;
214             }
215             case R.id.actionSave: {
216                 if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
217                     saveToGallery();
218                 } else {
219                     requestStoragePermission(chart);
220                 }
221                 break;
222             }
223         }
224         return true;
225     }
226 
227     @Override
saveToGallery()228     protected void saveToGallery() {
229         saveToGallery(chart, "ScatterChartActivity");
230     }
231 
232     @Override
onValueSelected(Entry e, Highlight h)233     public void onValueSelected(Entry e, Highlight h) {
234         Log.i("VAL SELECTED",
235                 "Value: " + e.getY() + ", xIndex: " + e.getX()
236                         + ", DataSet index: " + h.getDataSetIndex());
237     }
238 
239     @Override
onNothingSelected()240     public void onNothingSelected() {}
241 
242     @Override
onStartTrackingTouch(SeekBar seekBar)243     public void onStartTrackingTouch(SeekBar seekBar) {}
244 
245     @Override
onStopTrackingTouch(SeekBar seekBar)246     public void onStopTrackingTouch(SeekBar seekBar) {}
247 }
248