forked from PhilJay/MPAndroidChart
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Improved negative offset for horz bar chart
- Loading branch information
1 parent
67f82f1
commit ff5deba
Showing
4 changed files
with
303 additions
and
5 deletions.
There are no files selected for viewing
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
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