-
-
Notifications
You must be signed in to change notification settings - Fork 9k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #4787 from danielgindi/feature/catching_up_to_ios
Feature/catching up to ios
- Loading branch information
Showing
36 changed files
with
1,091 additions
and
240 deletions.
There are no files selected for viewing
288 changes: 288 additions & 0 deletions
288
...artExample/src/com/xxmassdeveloper/mpchartexample/HorizontalBarNegativeChartActivity.java
This file contains 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,288 @@ | ||
|
||
package com.xxmassdeveloper.mpchartexample; | ||
|
||
import android.annotation.SuppressLint; | ||
import android.graphics.RectF; | ||
import android.os.Bundle; | ||
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 android.widget.Toast; | ||
|
||
import com.github.mikephil.charting.charts.HorizontalBarChart; | ||
import com.github.mikephil.charting.components.Legend; | ||
import com.github.mikephil.charting.components.XAxis; | ||
import com.github.mikephil.charting.components.XAxis.XAxisPosition; | ||
import com.github.mikephil.charting.components.YAxis; | ||
import com.github.mikephil.charting.data.BarData; | ||
import com.github.mikephil.charting.data.BarDataSet; | ||
import com.github.mikephil.charting.data.BarEntry; | ||
import com.github.mikephil.charting.data.Entry; | ||
import com.github.mikephil.charting.highlight.Highlight; | ||
import com.github.mikephil.charting.interfaces.datasets.IBarDataSet; | ||
import com.github.mikephil.charting.listener.OnChartValueSelectedListener; | ||
import com.github.mikephil.charting.utils.MPPointF; | ||
import com.xxmassdeveloper.mpchartexample.notimportant.DemoBase; | ||
|
||
import java.util.ArrayList; | ||
import java.util.List; | ||
|
||
public class HorizontalBarNegativeChartActivity extends DemoBase implements OnSeekBarChangeListener, | ||
OnChartValueSelectedListener { | ||
|
||
protected HorizontalBarChart mChart; | ||
private SeekBar mSeekBarX, mSeekBarY; | ||
private TextView tvX, tvY; | ||
|
||
@Override | ||
protected void onCreate(Bundle savedInstanceState) { | ||
super.onCreate(savedInstanceState); | ||
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, | ||
WindowManager.LayoutParams.FLAG_FULLSCREEN); | ||
setContentView(R.layout.activity_horizontalbarchart); | ||
|
||
tvX = findViewById(R.id.tvXMax); | ||
tvY = (TextView) findViewById(R.id.tvYMax); | ||
|
||
mSeekBarX = (SeekBar) findViewById(R.id.seekBar1); | ||
mSeekBarY = (SeekBar) findViewById(R.id.seekBar2); | ||
|
||
mChart = (HorizontalBarChart) findViewById(R.id.chart1); | ||
mChart.setOnChartValueSelectedListener(this); | ||
// mChart.setHighlightEnabled(false); | ||
|
||
mChart.setDrawBarShadow(false); | ||
|
||
mChart.setDrawValueAboveBar(true); | ||
|
||
mChart.getDescription().setEnabled(false); | ||
|
||
// if more than 60 entries are displayed in the chart, no values will be | ||
// drawn | ||
mChart.setMaxVisibleValueCount(60); | ||
|
||
// scaling can now only be done on x- and y-axis separately | ||
mChart.setPinchZoom(false); | ||
|
||
// draw shadows for each bar that show the maximum value | ||
// mChart.setDrawBarShadow(true); | ||
|
||
mChart.setDrawGridBackground(false); | ||
|
||
XAxis xl = mChart.getXAxis(); | ||
xl.setPosition(XAxisPosition.BOTTOM); | ||
xl.setTypeface(mTfLight); | ||
xl.setDrawAxisLine(true); | ||
xl.setDrawGridLines(false); | ||
xl.setGranularity(10f); | ||
|
||
YAxis yl = mChart.getAxisLeft(); | ||
yl.setTypeface(mTfLight); | ||
yl.setDrawAxisLine(true); | ||
yl.setDrawGridLines(true); | ||
yl.setDrawZeroLine(true); // draw a zero line | ||
// yl.setInverted(true); | ||
|
||
YAxis yr = mChart.getAxisRight(); | ||
yr.setTypeface(mTfLight); | ||
yr.setDrawAxisLine(true); | ||
yr.setDrawGridLines(false); | ||
// yr.setInverted(true); | ||
|
||
setData(12, 50); | ||
mChart.setFitBars(true); | ||
mChart.animateY(2500); | ||
|
||
// setting data | ||
mSeekBarY.setProgress(50); | ||
mSeekBarX.setProgress(12); | ||
|
||
mSeekBarY.setOnSeekBarChangeListener(this); | ||
mSeekBarX.setOnSeekBarChangeListener(this); | ||
|
||
Legend l = mChart.getLegend(); | ||
l.setVerticalAlignment(Legend.LegendVerticalAlignment.BOTTOM); | ||
l.setHorizontalAlignment(Legend.LegendHorizontalAlignment.LEFT); | ||
l.setOrientation(Legend.LegendOrientation.HORIZONTAL); | ||
l.setDrawInside(false); | ||
l.setFormSize(8f); | ||
l.setXEntrySpace(4f); | ||
} | ||
|
||
@Override | ||
public boolean onCreateOptionsMenu(Menu menu) { | ||
getMenuInflater().inflate(R.menu.bar, menu); | ||
return true; | ||
} | ||
|
||
@Override | ||
public boolean onOptionsItemSelected(MenuItem item) { | ||
|
||
switch (item.getItemId()) { | ||
case R.id.actionToggleValues: { | ||
List<IBarDataSet> sets = mChart.getData() | ||
.getDataSets(); | ||
|
||
for (IBarDataSet iSet : sets) { | ||
|
||
IBarDataSet set = (BarDataSet) iSet; | ||
set.setDrawValues(!set.isDrawValuesEnabled()); | ||
} | ||
|
||
mChart.invalidate(); | ||
break; | ||
} | ||
case R.id.actionToggleIcons: { | ||
List<IBarDataSet> sets = mChart.getData() | ||
.getDataSets(); | ||
|
||
for (IBarDataSet iSet : sets) { | ||
|
||
IBarDataSet set = (BarDataSet) iSet; | ||
set.setDrawIcons(!set.isDrawIconsEnabled()); | ||
} | ||
|
||
mChart.invalidate(); | ||
break; | ||
} | ||
case R.id.actionToggleHighlight: { | ||
if(mChart.getData() != null) { | ||
mChart.getData().setHighlightEnabled(!mChart.getData().isHighlightEnabled()); | ||
mChart.invalidate(); | ||
} | ||
break; | ||
} | ||
case R.id.actionTogglePinch: { | ||
if (mChart.isPinchZoomEnabled()) | ||
mChart.setPinchZoom(false); | ||
else | ||
mChart.setPinchZoom(true); | ||
|
||
mChart.invalidate(); | ||
break; | ||
} | ||
case R.id.actionToggleAutoScaleMinMax: { | ||
mChart.setAutoScaleMinMaxEnabled(!mChart.isAutoScaleMinMaxEnabled()); | ||
mChart.notifyDataSetChanged(); | ||
break; | ||
} | ||
case R.id.actionToggleBarBorders: { | ||
for (IBarDataSet set : mChart.getData().getDataSets()) | ||
((BarDataSet)set).setBarBorderWidth(set.getBarBorderWidth() == 1.f ? 0.f : 1.f); | ||
|
||
mChart.invalidate(); | ||
break; | ||
} | ||
case R.id.animateX: { | ||
mChart.animateX(3000); | ||
break; | ||
} | ||
case R.id.animateY: { | ||
mChart.animateY(3000); | ||
break; | ||
} | ||
case R.id.animateXY: { | ||
|
||
mChart.animateXY(3000, 3000); | ||
break; | ||
} | ||
case R.id.actionSave: { | ||
if (mChart.saveToGallery("title" + System.currentTimeMillis(), 50)) { | ||
Toast.makeText(getApplicationContext(), "Saving SUCCESSFUL!", | ||
Toast.LENGTH_SHORT).show(); | ||
} else | ||
Toast.makeText(getApplicationContext(), "Saving FAILED!", Toast.LENGTH_SHORT) | ||
.show(); | ||
break; | ||
} | ||
} | ||
return true; | ||
} | ||
|
||
@Override | ||
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { | ||
|
||
tvX.setText("" + (mSeekBarX.getProgress() + 1)); | ||
tvY.setText("" + (mSeekBarY.getProgress())); | ||
|
||
setData(mSeekBarX.getProgress() + 1, mSeekBarY.getProgress()); | ||
mChart.setFitBars(true); | ||
mChart.invalidate(); | ||
} | ||
|
||
@Override | ||
public void onStartTrackingTouch(SeekBar seekBar) { | ||
// TODO Auto-generated method stub | ||
|
||
} | ||
|
||
@Override | ||
public void onStopTrackingTouch(SeekBar seekBar) { | ||
// TODO Auto-generated method stub | ||
|
||
} | ||
|
||
private void setData(int count, float range) { | ||
|
||
float barWidth = 9f; | ||
float spaceForBar = 10f; | ||
ArrayList<BarEntry> yVals1 = new ArrayList<BarEntry>(); | ||
|
||
for (int i = 0; i < count; i++) { | ||
float val = (float) (Math.random() * range - range / 2); | ||
yVals1.add(new BarEntry(i * spaceForBar, val, | ||
getResources().getDrawable(R.drawable.star))); | ||
} | ||
|
||
BarDataSet set1; | ||
|
||
if (mChart.getData() != null && | ||
mChart.getData().getDataSetCount() > 0) { | ||
set1 = (BarDataSet)mChart.getData().getDataSetByIndex(0); | ||
set1.setValues(yVals1); | ||
mChart.getData().notifyDataChanged(); | ||
mChart.notifyDataSetChanged(); | ||
} else { | ||
set1 = new BarDataSet(yVals1, "DataSet 1"); | ||
|
||
set1.setDrawIcons(false); | ||
|
||
ArrayList<IBarDataSet> dataSets = new ArrayList<IBarDataSet>(); | ||
dataSets.add(set1); | ||
|
||
BarData data = new BarData(dataSets); | ||
data.setValueTextSize(10f); | ||
data.setValueTypeface(mTfLight); | ||
data.setBarWidth(barWidth); | ||
mChart.setData(data); | ||
} | ||
} | ||
|
||
protected RectF mOnValueSelectedRectF = new RectF(); | ||
@SuppressLint("NewApi") | ||
@Override | ||
public void onValueSelected(Entry e, Highlight h) { | ||
|
||
if (e == null) | ||
return; | ||
|
||
RectF bounds = mOnValueSelectedRectF; | ||
mChart.getBarBounds((BarEntry) e, bounds); | ||
|
||
MPPointF position = mChart.getPosition(e, mChart.getData().getDataSetByIndex(h.getDataSetIndex()) | ||
.getAxisDependency()); | ||
|
||
Log.i("bounds", bounds.toString()); | ||
Log.i("position", position.toString()); | ||
|
||
MPPointF.recycleInstance(position); | ||
} | ||
|
||
@Override | ||
public void onNothingSelected() { | ||
}; | ||
} |
This file contains 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
This file contains 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
Oops, something went wrong.