17
17
import android .view .WindowManager ;
18
18
import android .widget .SeekBar ;
19
19
import android .widget .SeekBar .OnSeekBarChangeListener ;
20
- import android .widget .TextView ;
21
20
22
21
import com .github .mikephil .charting .animation .Easing ;
23
22
import com .github .mikephil .charting .charts .LineChart ;
35
34
import com .github .mikephil .charting .listener .OnChartValueSelectedListener ;
36
35
import com .github .mikephil .charting .utils .Utils ;
37
36
import com .xxmassdeveloper .mpchartexample .custom .MyMarkerView ;
37
+ import com .xxmassdeveloper .mpchartexample .databinding .ActivityLinechartBinding ;
38
38
import com .xxmassdeveloper .mpchartexample .notimportant .DemoBase ;
39
39
40
40
import java .util .ArrayList ;
45
45
*/
46
46
public class LineChartActivity1 extends DemoBase implements OnSeekBarChangeListener , OnChartValueSelectedListener {
47
47
48
- private LineChart chart1 ;
49
- private SeekBar seekBarX , seekBarY ;
50
- private TextView tvX , tvY ;
48
+ private ActivityLinechartBinding binding ;
51
49
52
50
@ Override
53
51
protected void onCreate (Bundle savedInstanceState ) {
54
52
super .onCreate (savedInstanceState );
53
+ binding = ActivityLinechartBinding .inflate (getLayoutInflater ());
54
+ setContentView (binding .getRoot ());
55
+
55
56
getWindow ().setFlags (WindowManager .LayoutParams .FLAG_FULLSCREEN , WindowManager .LayoutParams .FLAG_FULLSCREEN );
56
- setContentView (R .layout .activity_linechart );
57
57
58
58
setTitle ("LineChartActivity1" );
59
59
60
- tvX = findViewById (R .id .tvXMax );
61
- tvY = findViewById (R .id .tvYMax );
62
-
63
- seekBarX = findViewById (R .id .seekBarX );
64
- seekBarX .setOnSeekBarChangeListener (this );
65
-
66
- seekBarY = findViewById (R .id .seekBarY );
67
- seekBarY .setMax (180 );
68
- seekBarY .setOnSeekBarChangeListener (this );
60
+ binding .seekBarX .setOnSeekBarChangeListener (this );
69
61
70
- chart1 = findViewById (R .id .chart1 );
62
+ binding .seekBarY .setMax (180 );
63
+ binding .seekBarY .setOnSeekBarChangeListener (this );
71
64
72
65
// background color
73
- chart1 .setBackgroundColor (Color .WHITE );
66
+ binding . chart1 .setBackgroundColor (Color .WHITE );
74
67
75
68
// disable description text
76
- chart1 .getDescription ().setEnabled (false );
69
+ binding . chart1 .getDescription ().setEnabled (false );
77
70
78
71
// enable touch gestures
79
- chart1 .setTouchEnabled (true );
72
+ binding . chart1 .setTouchEnabled (true );
80
73
81
74
// set listeners
82
- chart1 .setOnChartValueSelectedListener (this );
83
- chart1 .setDrawGridBackground (false );
75
+ binding . chart1 .setOnChartValueSelectedListener (this );
76
+ binding . chart1 .setDrawGridBackground (false );
84
77
85
78
// create marker to display box when values are selected
86
79
MyMarkerView mv = new MyMarkerView (this , R .layout .custom_marker_view );
87
80
88
81
// Set the marker to the chart
89
- mv .setChartView (chart1 );
90
- chart1 .setMarker (mv );
82
+ mv .setChartView (binding . chart1 );
83
+ binding . chart1 .setMarker (mv );
91
84
92
85
// enable scaling and dragging
93
- chart1 .setDragEnabled (true );
94
- chart1 .setScaleEnabled (true );
86
+ binding . chart1 .setDragEnabled (true );
87
+ binding . chart1 .setScaleEnabled (true );
95
88
96
89
// force pinch zoom along both axis
97
- chart1 .setPinchZoom (true );
90
+ binding . chart1 .setPinchZoom (true );
98
91
99
92
XAxis xAxis ;
100
- xAxis = chart1 .getXAxis ();
93
+ xAxis = binding . chart1 .getXAxis ();
101
94
102
95
// vertical grid lines
103
96
xAxis .enableGridDashedLine (10f , 10f , 0f );
104
97
105
98
YAxis yAxis ;
106
- yAxis = chart1 .getAxisLeft ();
99
+ yAxis = binding . chart1 .getAxisLeft ();
107
100
108
101
// disable dual axis (only use LEFT axis)
109
- chart1 .getAxisRight ().setEnabled (false );
102
+ binding . chart1 .getAxisRight ().setEnabled (false );
110
103
111
104
// horizontal grid lines
112
105
yAxis .enableGridDashedLine (10f , 10f , 0f );
@@ -146,90 +139,90 @@ protected void onCreate(Bundle savedInstanceState) {
146
139
//xAxis.addLimitLine(llXAxis);
147
140
148
141
// add data
149
- seekBarX .setProgress (45 );
150
- seekBarY .setProgress (180 );
142
+ binding . seekBarX .setProgress (45 );
143
+ binding . seekBarY .setProgress (180 );
151
144
setData (45 , 180 );
152
145
153
146
// draw points over time
154
- chart1 .animateX (1500 );
147
+ binding . chart1 .animateX (1500 );
155
148
156
149
// get the legend (only possible after setting data)
157
- Legend l = chart1 .getLegend ();
150
+ Legend l = binding . chart1 .getLegend ();
158
151
159
152
// draw legend entries as lines
160
153
l .setForm (LegendForm .LINE );
161
154
}
162
155
163
156
private void setData (int count , float range ) {
164
-
157
+ Log . d ( "setData" , count + "= range=" + range );
165
158
ArrayList <Entry > values = new ArrayList <>();
166
159
167
160
for (int i = 0 ; i < count ; i ++) {
168
-
169
161
float val = (float ) (Math .random () * range ) - 30 ;
162
+ Log .v ("setData" , i + "=" + val );
170
163
values .add (new Entry (i , val , ContextCompat .getDrawable (this , R .drawable .star )));
171
164
}
172
165
173
- LineDataSet set1 ;
166
+ LineDataSet lineDataSet0 ;
174
167
175
- if (chart1 .getData () != null && chart1 .getData ().getDataSetCount () > 0 ) {
176
- set1 = (LineDataSet ) chart1 .getData ().getDataSetByIndex (0 );
177
- set1 . setValues (values );
178
- set1 .notifyDataSetChanged ();
179
- chart1 .getData ().notifyDataChanged ();
180
- chart1 .notifyDataSetChanged ();
168
+ if (binding . chart1 .getData () != null && binding . chart1 .getData ().getDataSetCount () > 0 ) {
169
+ lineDataSet0 = (LineDataSet ) binding . chart1 .getData ().getDataSetByIndex (0 );
170
+ lineDataSet0 . setEntries (values );
171
+ lineDataSet0 .notifyDataSetChanged ();
172
+ binding . chart1 .getData ().notifyDataChanged ();
173
+ binding . chart1 .notifyDataSetChanged ();
181
174
} else {
182
175
// create a dataset and give it a type
183
- set1 = new LineDataSet (values , "DataSet 1" );
176
+ lineDataSet0 = new LineDataSet (values , "DataSet 1" );
184
177
185
- set1 .setDrawIcons (false );
178
+ lineDataSet0 .setDrawIcons (false );
186
179
187
180
// draw dashed line
188
- set1 .enableDashedLine (10f , 5f , 0f );
181
+ lineDataSet0 .enableDashedLine (10f , 5f , 0f );
189
182
190
183
// black lines and points
191
- set1 .setColor (Color .BLACK );
192
- set1 .setCircleColor (Color .BLACK );
184
+ lineDataSet0 .setColor (Color .BLACK );
185
+ lineDataSet0 .setCircleColor (Color .BLACK );
193
186
194
187
// line thickness and point size
195
- set1 .setLineWidth (1f );
196
- set1 .setCircleRadius (3f );
188
+ lineDataSet0 .setLineWidth (1f );
189
+ lineDataSet0 .setCircleRadius (3f );
197
190
198
191
// draw points as solid circles
199
- set1 .setDrawCircleHole (false );
192
+ lineDataSet0 .setDrawCircleHole (false );
200
193
201
194
// customize legend entry
202
- set1 .setFormLineWidth (1f );
203
- set1 .setFormLineDashEffect (new DashPathEffect (new float []{10f , 5f }, 0f ));
204
- set1 .setFormSize (15.f );
195
+ lineDataSet0 .setFormLineWidth (1f );
196
+ lineDataSet0 .setFormLineDashEffect (new DashPathEffect (new float []{10f , 5f }, 0f ));
197
+ lineDataSet0 .setFormSize (15.f );
205
198
206
199
// text size of values
207
- set1 .setValueTextSize (9f );
200
+ lineDataSet0 .setValueTextSize (9f );
208
201
209
202
// draw selection line as dashed
210
- set1 .enableDashedHighlightLine (10f , 5f , 0f );
203
+ lineDataSet0 .enableDashedHighlightLine (10f , 5f , 0f );
211
204
212
205
// set the filled area
213
- set1 .setDrawFilled (true );
214
- set1 .setFillFormatter ((dataSet , dataProvider ) -> chart1 .getAxisLeft ().getAxisMinimum ());
206
+ lineDataSet0 .setDrawFilled (true );
207
+ lineDataSet0 .setFillFormatter ((dataSet , dataProvider ) -> binding . chart1 .getAxisLeft ().getAxisMinimum ());
215
208
216
209
// set color of filled area
217
210
if (Utils .getSDKInt () >= 18 ) {
218
211
// drawables only supported on api level 18 and above
219
212
Drawable drawable = ContextCompat .getDrawable (this , R .drawable .fade_red );
220
- set1 .setFillDrawable (drawable );
213
+ lineDataSet0 .setFillDrawable (drawable );
221
214
} else {
222
- set1 .setFillColor (Color .BLACK );
215
+ lineDataSet0 .setFillColor (Color .BLACK );
223
216
}
224
217
225
218
ArrayList <ILineDataSet > dataSets = new ArrayList <>();
226
- dataSets .add (set1 ); // add the data sets
219
+ dataSets .add (lineDataSet0 ); // add the data sets
227
220
228
221
// create a data object with the data sets
229
222
LineData data = new LineData (dataSets );
230
223
231
224
// set data
232
- chart1 .setData (data );
225
+ binding . chart1 .setData (data );
233
226
}
234
227
}
235
228
@@ -249,101 +242,101 @@ public boolean onOptionsItemSelected(MenuItem item) {
249
242
startActivity (i );
250
243
}
251
244
case R .id .actionToggleValues -> {
252
- List <ILineDataSet > sets = chart1 .getData ().getDataSets ();
245
+ List <ILineDataSet > sets = binding . chart1 .getData ().getDataSets ();
253
246
254
247
for (ILineDataSet iSet : sets ) {
255
248
256
249
LineDataSet set = (LineDataSet ) iSet ;
257
250
set .setDrawValues (!set .isDrawValuesEnabled ());
258
251
}
259
252
260
- chart1 .invalidate ();
253
+ binding . chart1 .invalidate ();
261
254
}
262
255
case R .id .actionToggleIcons -> {
263
- List <ILineDataSet > sets = chart1 .getData ().getDataSets ();
256
+ List <ILineDataSet > sets = binding . chart1 .getData ().getDataSets ();
264
257
265
258
for (ILineDataSet iSet : sets ) {
266
259
267
260
LineDataSet set = (LineDataSet ) iSet ;
268
261
set .setDrawIcons (!set .isDrawIconsEnabled ());
269
262
}
270
263
271
- chart1 .invalidate ();
264
+ binding . chart1 .invalidate ();
272
265
}
273
266
case R .id .actionToggleHighlight -> {
274
- if (chart1 .getData () != null ) {
275
- chart1 .getData ().setHighlightEnabled (!chart1 .getData ().isHighlightEnabled ());
276
- chart1 .invalidate ();
267
+ if (binding . chart1 .getData () != null ) {
268
+ binding . chart1 .getData ().setHighlightEnabled (!binding . chart1 .getData ().isHighlightEnabled ());
269
+ binding . chart1 .invalidate ();
277
270
}
278
271
}
279
272
case R .id .actionToggleFilled -> {
280
273
281
- List <ILineDataSet > sets = chart1 .getData ().getDataSets ();
274
+ List <ILineDataSet > sets = binding . chart1 .getData ().getDataSets ();
282
275
283
276
for (ILineDataSet iSet : sets ) {
284
277
285
278
LineDataSet set = (LineDataSet ) iSet ;
286
279
set .setDrawFilled (!set .isDrawFilledEnabled ());
287
280
}
288
- chart1 .invalidate ();
281
+ binding . chart1 .invalidate ();
289
282
}
290
283
case R .id .actionToggleCircles -> {
291
- List <ILineDataSet > sets = chart1 .getData ().getDataSets ();
284
+ List <ILineDataSet > sets = binding . chart1 .getData ().getDataSets ();
292
285
293
286
for (ILineDataSet iSet : sets ) {
294
287
295
288
LineDataSet set = (LineDataSet ) iSet ;
296
289
set .setDrawCircles (!set .isDrawCirclesEnabled ());
297
290
}
298
- chart1 .invalidate ();
291
+ binding . chart1 .invalidate ();
299
292
}
300
293
case R .id .actionToggleCubic -> {
301
- List <ILineDataSet > sets = chart1 .getData ().getDataSets ();
294
+ List <ILineDataSet > sets = binding . chart1 .getData ().getDataSets ();
302
295
303
296
for (ILineDataSet iSet : sets ) {
304
297
305
298
LineDataSet set = (LineDataSet ) iSet ;
306
299
set .setMode (set .getMode () == LineDataSet .Mode .CUBIC_BEZIER ? LineDataSet .Mode .LINEAR : LineDataSet .Mode .CUBIC_BEZIER );
307
300
}
308
- chart1 .invalidate ();
301
+ binding . chart1 .invalidate ();
309
302
}
310
303
case R .id .actionToggleStepped -> {
311
- List <ILineDataSet > sets = chart1 .getData ().getDataSets ();
304
+ List <ILineDataSet > sets = binding . chart1 .getData ().getDataSets ();
312
305
313
306
for (ILineDataSet iSet : sets ) {
314
307
315
308
LineDataSet set = (LineDataSet ) iSet ;
316
309
set .setMode (set .getMode () == LineDataSet .Mode .STEPPED ? LineDataSet .Mode .LINEAR : LineDataSet .Mode .STEPPED );
317
310
}
318
- chart1 .invalidate ();
311
+ binding . chart1 .invalidate ();
319
312
}
320
313
case R .id .actionToggleHorizontalCubic -> {
321
- List <ILineDataSet > sets = chart1 .getData ().getDataSets ();
314
+ List <ILineDataSet > sets = binding . chart1 .getData ().getDataSets ();
322
315
323
316
for (ILineDataSet iSet : sets ) {
324
317
325
318
LineDataSet set = (LineDataSet ) iSet ;
326
319
set .setMode (set .getMode () == LineDataSet .Mode .HORIZONTAL_BEZIER ? LineDataSet .Mode .LINEAR : LineDataSet .Mode .HORIZONTAL_BEZIER );
327
320
}
328
- chart1 .invalidate ();
321
+ binding . chart1 .invalidate ();
329
322
}
330
323
case R .id .actionTogglePinch -> {
331
- chart1 .setPinchZoom (!chart1 .isPinchZoomEnabled ());
324
+ binding . chart1 .setPinchZoom (!binding . chart1 .isPinchZoomEnabled ());
332
325
333
- chart1 .invalidate ();
326
+ binding . chart1 .invalidate ();
334
327
}
335
328
case R .id .actionToggleAutoScaleMinMax -> {
336
- chart1 .setAutoScaleMinMaxEnabled (!chart1 .isAutoScaleMinMaxEnabled ());
337
- chart1 .notifyDataSetChanged ();
329
+ binding . chart1 .setAutoScaleMinMaxEnabled (!binding . chart1 .isAutoScaleMinMaxEnabled ());
330
+ binding . chart1 .notifyDataSetChanged ();
338
331
}
339
- case R .id .animateX -> chart1 .animateX (2000 );
340
- case R .id .animateY -> chart1 .animateY (2000 , Easing .EaseInCubic );
341
- case R .id .animateXY -> chart1 .animateXY (2000 , 2000 );
332
+ case R .id .animateX -> binding . chart1 .animateX (2000 );
333
+ case R .id .animateY -> binding . chart1 .animateY (2000 , Easing .EaseInCubic );
334
+ case R .id .animateXY -> binding . chart1 .animateXY (2000 , 2000 );
342
335
case R .id .actionSave -> {
343
336
if (ContextCompat .checkSelfPermission (this , Manifest .permission .WRITE_EXTERNAL_STORAGE ) == PackageManager .PERMISSION_GRANTED ) {
344
337
saveToGallery ();
345
338
} else {
346
- requestStoragePermission (chart1 );
339
+ requestStoragePermission (binding . chart1 );
347
340
}
348
341
}
349
342
}
@@ -353,18 +346,18 @@ public boolean onOptionsItemSelected(MenuItem item) {
353
346
@ Override
354
347
public void onProgressChanged (SeekBar seekBar , int progress , boolean fromUser ) {
355
348
356
- tvX . setText (String .valueOf (seekBarX .getProgress ()));
357
- tvY . setText (String .valueOf (seekBarY .getProgress ()));
349
+ binding . tvXMax . setText (String .valueOf (binding . seekBarX .getProgress ()));
350
+ binding . tvYMax . setText (String .valueOf (binding . seekBarY .getProgress ()));
358
351
359
- setData (seekBarX .getProgress (), seekBarY .getProgress ());
352
+ setData (binding . seekBarX .getProgress (), binding . seekBarY .getProgress ());
360
353
361
354
// redraw
362
- chart1 .invalidate ();
355
+ binding . chart1 .invalidate ();
363
356
}
364
357
365
358
@ Override
366
359
protected void saveToGallery () {
367
- saveToGallery (chart1 , "LineChartActivity1" );
360
+ saveToGallery (binding . chart1 , "LineChartActivity1" );
368
361
}
369
362
370
363
@ Override
@@ -378,8 +371,8 @@ public void onStopTrackingTouch(SeekBar seekBar) {
378
371
@ Override
379
372
public void onValueSelected (Entry e , Highlight h ) {
380
373
Log .i ("Entry selected" , e .toString ());
381
- Log .i ("LOW HIGH" , "low: " + chart1 .getLowestVisibleX () + ", high: " + chart1 .getHighestVisibleX ());
382
- Log .i ("MIN MAX" , "xMin: " + chart1 .getXChartMin () + ", xMax: " + chart1 .getXChartMax () + ", yMin: " + chart1 .getYChartMin () + ", yMax: " + chart1 .getYChartMax ());
374
+ Log .i ("LOW HIGH" , "low: " + binding . chart1 .getLowestVisibleX () + ", high: " + binding . chart1 .getHighestVisibleX ());
375
+ Log .i ("MIN MAX" , "xMin: " + binding . chart1 .getXChartMin () + ", xMax: " + binding . chart1 .getXChartMax () + ", yMin: " + binding . chart1 .getYChartMin () + ", yMax: " + binding . chart1 .getYChartMax ());
383
376
}
384
377
385
378
@ Override
0 commit comments