Created
May 30, 2017 09:35
-
-
Save ivnsch/278a52f4e63d5893df20c4ff6f9be70c to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.xxmassdeveloper.mpchartexample; | |
import android.graphics.Color; | |
import android.os.Bundle; | |
import android.util.Log; | |
import android.view.Menu; | |
import android.view.MenuItem; | |
import android.view.MotionEvent; | |
import android.view.WindowManager; | |
import android.widget.Toast; | |
import com.github.mikephil.charting.charts.LineChart; | |
import com.github.mikephil.charting.components.Legend; | |
import com.github.mikephil.charting.components.Legend.LegendForm; | |
import com.github.mikephil.charting.components.XAxis; | |
import com.github.mikephil.charting.components.YAxis; | |
import com.github.mikephil.charting.components.YAxis.AxisDependency; | |
import com.github.mikephil.charting.data.Entry; | |
import com.github.mikephil.charting.data.LineData; | |
import com.github.mikephil.charting.data.LineDataSet; | |
import com.github.mikephil.charting.highlight.Highlight; | |
import com.github.mikephil.charting.interfaces.datasets.ILineDataSet; | |
import com.github.mikephil.charting.listener.ChartTouchListener; | |
import com.github.mikephil.charting.listener.OnChartGestureListener; | |
import com.github.mikephil.charting.listener.OnChartValueSelectedListener; | |
import com.github.mikephil.charting.utils.ColorTemplate; | |
import com.xxmassdeveloper.mpchartexample.notimportant.DemoBase; | |
public class RealtimeLineChartActivity extends DemoBase implements | |
OnChartValueSelectedListener { | |
private LineChart mChart; | |
private boolean moveToLastEntry = true; | |
@Override | |
protected void onCreate(Bundle savedInstanceState) { | |
super.onCreate(savedInstanceState); | |
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, | |
WindowManager.LayoutParams.FLAG_FULLSCREEN); | |
setContentView(R.layout.activity_realtime_linechart); | |
mChart = (LineChart) findViewById(R.id.chart1); | |
mChart.setOnChartValueSelectedListener(this); | |
// enable description text | |
mChart.getDescription().setEnabled(true); | |
// enable touch gestures | |
mChart.setTouchEnabled(true); | |
// enable scaling and dragging | |
mChart.setDragEnabled(true); | |
mChart.setScaleEnabled(true); | |
mChart.setDrawGridBackground(false); | |
// if disabled, scaling can be done on x- and y-axis separately | |
mChart.setPinchZoom(false); | |
// set an alternative background color | |
mChart.setBackgroundColor(Color.LTGRAY); | |
LineData data = new LineData(); | |
data.setValueTextColor(Color.WHITE); | |
// add empty data | |
mChart.setData(data); | |
// get the legend (only possible after setting data) | |
Legend l = mChart.getLegend(); | |
// modify the legend ... | |
l.setForm(LegendForm.LINE); | |
l.setTypeface(mTfLight); | |
l.setTextColor(Color.WHITE); | |
XAxis xl = mChart.getXAxis(); | |
xl.setTypeface(mTfLight); | |
xl.setTextColor(Color.WHITE); | |
xl.setDrawGridLines(false); | |
xl.setAvoidFirstLastClipping(true); | |
xl.setEnabled(true); | |
YAxis leftAxis = mChart.getAxisLeft(); | |
leftAxis.setTypeface(mTfLight); | |
leftAxis.setTextColor(Color.WHITE); | |
leftAxis.setAxisMaximum(100f); | |
leftAxis.setAxisMinimum(0f); | |
leftAxis.setDrawGridLines(true); | |
YAxis rightAxis = mChart.getAxisRight(); | |
rightAxis.setEnabled(false); | |
mChart.setOnChartGestureListener(new OnChartGestureListener() { | |
@Override | |
public void onChartGestureStart(MotionEvent me, ChartTouchListener.ChartGesture lastPerformedGesture) { | |
moveToLastEntry = false; | |
} | |
@Override | |
public void onChartGestureEnd(MotionEvent me, ChartTouchListener.ChartGesture lastPerformedGesture) { | |
} | |
@Override | |
public void onChartLongPressed(MotionEvent me) { | |
} | |
@Override | |
public void onChartDoubleTapped(MotionEvent me) { | |
} | |
@Override | |
public void onChartSingleTapped(MotionEvent me) { | |
} | |
@Override | |
public void onChartFling(MotionEvent me1, MotionEvent me2, float velocityX, float velocityY) { | |
} | |
@Override | |
public void onChartScale(MotionEvent me, float scaleX, float scaleY) { | |
} | |
@Override | |
public void onChartTranslate(MotionEvent me, float dX, float dY) { | |
} | |
}); | |
} | |
@Override | |
public boolean onCreateOptionsMenu(Menu menu) { | |
getMenuInflater().inflate(R.menu.realtime, menu); | |
return true; | |
} | |
@Override | |
public boolean onOptionsItemSelected(MenuItem item) { | |
switch (item.getItemId()) { | |
case R.id.actionAdd: { | |
addEntry(); | |
break; | |
} | |
case R.id.actionClear: { | |
mChart.clearValues(); | |
Toast.makeText(this, "Chart cleared!", Toast.LENGTH_SHORT).show(); | |
break; | |
} | |
case R.id.actionFeedMultiple: { | |
feedMultiple(); | |
break; | |
} | |
} | |
return true; | |
} | |
private void addEntry() { | |
LineData data = mChart.getData(); | |
if (data != null) { | |
ILineDataSet set = data.getDataSetByIndex(0); | |
// set.addEntry(...); // can be called as well | |
if (set == null) { | |
set = createSet(); | |
data.addDataSet(set); | |
} | |
data.addEntry(new Entry(set.getEntryCount(), (float) (Math.random() * 40) + 30f), 0); | |
data.notifyDataChanged(); | |
// let the chart know it's data has changed | |
mChart.notifyDataSetChanged(); | |
// limit the number of visible entries | |
mChart.setVisibleXRangeMaximum(120); | |
// mChart.setVisibleYRange(30, AxisDependency.LEFT); | |
if (moveToLastEntry) { | |
// move to the latest entry | |
mChart.moveViewToX(data.getEntryCount()); | |
} | |
// this automatically refreshes the chart (calls invalidate()) | |
// mChart.moveViewTo(data.getXValCount()-7, 55f, | |
// AxisDependency.LEFT); | |
} | |
} | |
private LineDataSet createSet() { | |
LineDataSet set = new LineDataSet(null, "Dynamic Data"); | |
set.setAxisDependency(AxisDependency.LEFT); | |
set.setColor(ColorTemplate.getHoloBlue()); | |
set.setCircleColor(Color.WHITE); | |
set.setLineWidth(2f); | |
set.setCircleRadius(4f); | |
set.setFillAlpha(65); | |
set.setFillColor(ColorTemplate.getHoloBlue()); | |
set.setHighLightColor(Color.rgb(244, 117, 117)); | |
set.setValueTextColor(Color.WHITE); | |
set.setValueTextSize(9f); | |
set.setDrawValues(false); | |
return set; | |
} | |
private Thread thread; | |
private void feedMultiple() { | |
if (thread != null) | |
thread.interrupt(); | |
final Runnable runnable = new Runnable() { | |
@Override | |
public void run() { | |
addEntry(); | |
} | |
}; | |
thread = new Thread(new Runnable() { | |
@Override | |
public void run() { | |
for (int i = 0; i < 100000; i++) { | |
// Don't generate garbage runnables inside the loop. | |
runOnUiThread(runnable); | |
try { | |
Thread.sleep(200); | |
} catch (InterruptedException e) { | |
// TODO Auto-generated catch block | |
e.printStackTrace(); | |
} | |
} | |
} | |
}); | |
thread.start(); | |
} | |
@Override | |
public void onValueSelected(Entry e, Highlight h) { | |
Log.i("Entry selected", e.toString()); | |
} | |
@Override | |
public void onNothingSelected() { | |
Log.i("Nothing selected", "Nothing selected."); | |
} | |
@Override | |
protected void onPause() { | |
super.onPause(); | |
if (thread != null) { | |
thread.interrupt(); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment