package com.android.stockapp.ui.mpchartexample; import android.Manifest; import android.content.Intent; import android.content.pm.PackageManager; import android.graphics.Color; import android.graphics.Typeface; import android.net.Uri; import android.os.Bundle; import android.text.SpannableString; import android.text.style.ForegroundColorSpan; import android.text.style.RelativeSizeSpan; import android.text.style.StyleSpan; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.WindowManager; import android.widget.SeekBar; import android.widget.SeekBar.OnSeekBarChangeListener; import android.widget.TextView; import androidx.core.content.ContextCompat; import com.android.stockapp.R; import com.android.stockapp.ui.mpchartexample.notimportant.DemoBase; import com.github.mikephil.charting.animation.Easing; import com.github.mikephil.charting.charts.PieChart; import com.github.mikephil.charting.components.Legend; import com.github.mikephil.charting.data.Entry; import com.github.mikephil.charting.data.PieData; import com.github.mikephil.charting.data.PieDataSet; import com.github.mikephil.charting.data.PieEntry; import com.github.mikephil.charting.formatter.PercentFormatter; import com.github.mikephil.charting.highlight.Highlight; import com.github.mikephil.charting.interfaces.datasets.IDataSet; import com.github.mikephil.charting.listener.OnChartValueSelectedListener; import com.github.mikephil.charting.utils.ColorTemplate; import java.util.ArrayList; public class PiePolylineChartActivity extends DemoBase implements OnSeekBarChangeListener, OnChartValueSelectedListener { private PieChart chart; private SeekBar seekBarX, seekBarY; private TextView tvX, tvY; private Typeface tf; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.activity_piechart); setTitle("PiePolylineChartActivity"); tvX = findViewById(R.id.tvXMax); tvY = findViewById(R.id.tvYMax); seekBarX = findViewById(R.id.seekBar1); seekBarY = findViewById(R.id.seekBar2); seekBarX.setOnSeekBarChangeListener(this); seekBarY.setOnSeekBarChangeListener(this); chart = findViewById(R.id.chart1); chart.setUsePercentValues(true); chart.getDescription().setEnabled(false); chart.setExtraOffsets(5, 10, 5, 5); chart.setDragDecelerationFrictionCoef(0.95f); tf = Typeface.createFromAsset(getAssets(), "OpenSans-Regular.ttf"); chart.setCenterTextTypeface(Typeface.createFromAsset(getAssets(), "OpenSans-Light.ttf")); chart.setCenterText(generateCenterSpannableText()); chart.setExtraOffsets(20.f, 0.f, 20.f, 0.f); chart.setDrawHoleEnabled(true); chart.setHoleColor(Color.WHITE); chart.setTransparentCircleColor(Color.WHITE); chart.setTransparentCircleAlpha(110); chart.setHoleRadius(58f); chart.setTransparentCircleRadius(61f); chart.setDrawCenterText(true); chart.setRotationAngle(0); // enable rotation of the chart by touch chart.setRotationEnabled(true); chart.setHighlightPerTapEnabled(true); // chart.setUnit(" €"); // chart.setDrawUnitsInChart(true); // add a selection listener chart.setOnChartValueSelectedListener(this); seekBarX.setProgress(4); seekBarY.setProgress(100); chart.animateY(1400, Easing.EaseInOutQuad); // chart.spin(2000, 0, 360); Legend l = chart.getLegend(); l.setVerticalAlignment(Legend.LegendVerticalAlignment.TOP); l.setHorizontalAlignment(Legend.LegendHorizontalAlignment.RIGHT); l.setOrientation(Legend.LegendOrientation.VERTICAL); l.setDrawInside(false); l.setEnabled(false); } private void setData(int count, float range) { ArrayList<PieEntry> entries = new ArrayList<>(); // NOTE: The order of the entries when being added to the entries array determines their position around the center of // the chart. for (int i = 0; i < count; i++) { entries.add(new PieEntry((float) (Math.random() * range) + range / 5, parties[i % parties.length])); } PieDataSet dataSet = new PieDataSet(entries, "Election Results"); dataSet.setSliceSpace(3f); dataSet.setSelectionShift(5f); // add a lot of colors ArrayList<Integer> colors = new ArrayList<>(); for (int c : ColorTemplate.VORDIPLOM_COLORS) colors.add(c); for (int c : ColorTemplate.JOYFUL_COLORS) colors.add(c); for (int c : ColorTemplate.COLORFUL_COLORS) colors.add(c); for (int c : ColorTemplate.LIBERTY_COLORS) colors.add(c); for (int c : ColorTemplate.PASTEL_COLORS) colors.add(c); colors.add(ColorTemplate.getHoloBlue()); dataSet.setColors(colors); //dataSet.setSelectionShift(0f); dataSet.setValueLinePart1OffsetPercentage(80.f); dataSet.setValueLinePart1Length(0.2f); dataSet.setValueLinePart2Length(0.4f); //dataSet.setUsingSliceColorAsValueLineColor(true); //dataSet.setXValuePosition(PieDataSet.ValuePosition.OUTSIDE_SLICE); dataSet.setYValuePosition(PieDataSet.ValuePosition.OUTSIDE_SLICE); PieData data = new PieData(dataSet); data.setValueFormatter(new PercentFormatter()); data.setValueTextSize(11f); data.setValueTextColor(Color.BLACK); data.setValueTypeface(tf); chart.setData(data); // undo all highlights chart.highlightValues(null); chart.invalidate(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.pie, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.viewGithub: { Intent i = new Intent(Intent.ACTION_VIEW); i.setData(Uri.parse("https://github.com/PhilJay/MPAndroidChart/blob/master/MPChartExample/src/com/xxmassdeveloper/mpchartexample/PiePolylineChartActivity.java")); startActivity(i); break; } case R.id.actionToggleValues: { for (IDataSet<?> set : chart.getData().getDataSets()) set.setDrawValues(!set.isDrawValuesEnabled()); chart.invalidate(); break; } case R.id.actionToggleHole: { if (chart.isDrawHoleEnabled()) chart.setDrawHoleEnabled(false); else chart.setDrawHoleEnabled(true); chart.invalidate(); break; } case R.id.actionToggleMinAngles: { if (chart.getMinAngleForSlices() == 0f) chart.setMinAngleForSlices(36f); else chart.setMinAngleForSlices(0f); chart.notifyDataSetChanged(); chart.invalidate(); break; } case R.id.actionToggleCurvedSlices: { boolean toSet = !chart.isDrawRoundedSlicesEnabled() || !chart.isDrawHoleEnabled(); chart.setDrawRoundedSlices(toSet); if (toSet && !chart.isDrawHoleEnabled()) { chart.setDrawHoleEnabled(true); } if (toSet && chart.isDrawSlicesUnderHoleEnabled()) { chart.setDrawSlicesUnderHole(false); } chart.invalidate(); break; } case R.id.actionDrawCenter: { if (chart.isDrawCenterTextEnabled()) chart.setDrawCenterText(false); else chart.setDrawCenterText(true); chart.invalidate(); break; } case R.id.actionToggleXValues: { chart.setDrawEntryLabels(!chart.isDrawEntryLabelsEnabled()); chart.invalidate(); break; } case R.id.actionTogglePercent: chart.setUsePercentValues(!chart.isUsePercentValuesEnabled()); chart.invalidate(); break; case R.id.animateX: { chart.animateX(1400); break; } case R.id.animateY: { chart.animateY(1400); break; } case R.id.animateXY: { chart.animateXY(1400, 1400); break; } case R.id.actionToggleSpin: { chart.spin(1000, chart.getRotationAngle(), chart.getRotationAngle() + 360, Easing.EaseInOutCubic); break; } case R.id.actionSave: { if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { saveToGallery(); } else { requestStoragePermission(chart); } break; } } return true; } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { tvX.setText(String.valueOf(seekBarX.getProgress())); tvY.setText(String.valueOf(seekBarY.getProgress())); setData(seekBarX.getProgress(), seekBarY.getProgress()); } @Override protected void saveToGallery() { saveToGallery(chart, "PiePolylineChartActivity"); } private SpannableString generateCenterSpannableText() { SpannableString s = new SpannableString("MPAndroidChart\ndeveloped by Philipp Jahoda"); s.setSpan(new RelativeSizeSpan(1.5f), 0, 14, 0); s.setSpan(new StyleSpan(Typeface.NORMAL), 14, s.length() - 15, 0); s.setSpan(new ForegroundColorSpan(Color.GRAY), 14, s.length() - 15, 0); s.setSpan(new RelativeSizeSpan(.65f), 14, s.length() - 15, 0); s.setSpan(new StyleSpan(Typeface.ITALIC), s.length() - 14, s.length(), 0); s.setSpan(new ForegroundColorSpan(ColorTemplate.getHoloBlue()), s.length() - 14, s.length(), 0); return s; } @Override public void onValueSelected(Entry e, Highlight h) { if (e == null) return; Log.i("VAL SELECTED", "Value: " + e.getY() + ", xIndex: " + e.getX() + ", DataSet index: " + h.getDataSetIndex()); } @Override public void onNothingSelected() { Log.i("PieChart", "nothing selected"); } @Override public void onStartTrackingTouch(SeekBar seekBar) {} @Override public void onStopTrackingTouch(SeekBar seekBar) {} }