mirror of
https://github.com/oliexdev/openScale.git
synced 2025-08-14 04:34:18 +02:00
on rolling chart auto scale y axis
This commit is contained in:
@@ -64,7 +64,7 @@ dependencies {
|
|||||||
implementation 'androidx.appcompat:appcompat:1.0.2'
|
implementation 'androidx.appcompat:appcompat:1.0.2'
|
||||||
implementation 'androidx.recyclerview:recyclerview:1.0.0'
|
implementation 'androidx.recyclerview:recyclerview:1.0.0'
|
||||||
// MPAndroidChart
|
// MPAndroidChart
|
||||||
implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0-alpha'
|
implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
|
||||||
// Simple CSV
|
// Simple CSV
|
||||||
implementation 'com.j256.simplecsv:simplecsv:2.3'
|
implementation 'com.j256.simplecsv:simplecsv:2.3'
|
||||||
// RxAndroidBle
|
// RxAndroidBle
|
||||||
|
@@ -33,6 +33,8 @@ import android.widget.PopupMenu;
|
|||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
import androidx.fragment.app.Fragment;
|
||||||
|
|
||||||
import com.github.mikephil.charting.charts.BarChart;
|
import com.github.mikephil.charting.charts.BarChart;
|
||||||
import com.github.mikephil.charting.components.AxisBase;
|
import com.github.mikephil.charting.components.AxisBase;
|
||||||
import com.github.mikephil.charting.components.XAxis;
|
import com.github.mikephil.charting.components.XAxis;
|
||||||
@@ -40,8 +42,8 @@ import com.github.mikephil.charting.data.BarData;
|
|||||||
import com.github.mikephil.charting.data.BarDataSet;
|
import com.github.mikephil.charting.data.BarDataSet;
|
||||||
import com.github.mikephil.charting.data.BarEntry;
|
import com.github.mikephil.charting.data.BarEntry;
|
||||||
import com.github.mikephil.charting.data.Entry;
|
import com.github.mikephil.charting.data.Entry;
|
||||||
import com.github.mikephil.charting.formatter.IAxisValueFormatter;
|
|
||||||
import com.github.mikephil.charting.formatter.StackedValueFormatter;
|
import com.github.mikephil.charting.formatter.StackedValueFormatter;
|
||||||
|
import com.github.mikephil.charting.formatter.ValueFormatter;
|
||||||
import com.github.mikephil.charting.highlight.Highlight;
|
import com.github.mikephil.charting.highlight.Highlight;
|
||||||
import com.github.mikephil.charting.interfaces.datasets.IBarDataSet;
|
import com.github.mikephil.charting.interfaces.datasets.IBarDataSet;
|
||||||
import com.github.mikephil.charting.listener.OnChartValueSelectedListener;
|
import com.github.mikephil.charting.listener.OnChartValueSelectedListener;
|
||||||
@@ -60,8 +62,6 @@ import java.util.Calendar;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
|
||||||
import androidx.fragment.app.Fragment;
|
|
||||||
|
|
||||||
public class GraphFragment extends Fragment implements FragmentUpdateListener {
|
public class GraphFragment extends Fragment implements FragmentUpdateListener {
|
||||||
private View graphView;
|
private View graphView;
|
||||||
private ChartMeasurementView chartView;
|
private ChartMeasurementView chartView;
|
||||||
@@ -128,12 +128,12 @@ public class GraphFragment extends Fragment implements FragmentUpdateListener {
|
|||||||
chartTopxAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
|
chartTopxAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
|
||||||
chartTopxAxis.setDrawGridLines(false);
|
chartTopxAxis.setDrawGridLines(false);
|
||||||
chartTopxAxis.setTextColor(ColorUtil.getTextColor(graphView.getContext()));
|
chartTopxAxis.setTextColor(ColorUtil.getTextColor(graphView.getContext()));
|
||||||
chartTopxAxis.setValueFormatter(new IAxisValueFormatter() {
|
chartTopxAxis.setValueFormatter(new ValueFormatter() {
|
||||||
|
|
||||||
private final SimpleDateFormat mFormat = new SimpleDateFormat("MMM", Locale.getDefault());
|
private final SimpleDateFormat mFormat = new SimpleDateFormat("MMM", Locale.getDefault());
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getFormattedValue(float value, AxisBase axis) {
|
public String getAxisLabel(float value, AxisBase axis) {
|
||||||
Calendar calendar = Calendar.getInstance();
|
Calendar calendar = Calendar.getInstance();
|
||||||
calendar.set(Calendar.MONTH, (int)value);
|
calendar.set(Calendar.MONTH, (int)value);
|
||||||
return mFormat.format(calendar.getTime());
|
return mFormat.format(calendar.getTime());
|
||||||
|
@@ -25,17 +25,17 @@ import android.view.ViewGroup;
|
|||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import androidx.fragment.app.Fragment;
|
||||||
|
|
||||||
import com.github.mikephil.charting.charts.RadarChart;
|
import com.github.mikephil.charting.charts.RadarChart;
|
||||||
import com.github.mikephil.charting.components.Legend;
|
import com.github.mikephil.charting.components.Legend;
|
||||||
import com.github.mikephil.charting.components.LegendEntry;
|
import com.github.mikephil.charting.components.LegendEntry;
|
||||||
import com.github.mikephil.charting.components.MarkerView;
|
import com.github.mikephil.charting.components.MarkerView;
|
||||||
import com.github.mikephil.charting.data.Entry;
|
|
||||||
import com.github.mikephil.charting.data.RadarData;
|
import com.github.mikephil.charting.data.RadarData;
|
||||||
import com.github.mikephil.charting.data.RadarDataSet;
|
import com.github.mikephil.charting.data.RadarDataSet;
|
||||||
import com.github.mikephil.charting.data.RadarEntry;
|
import com.github.mikephil.charting.data.RadarEntry;
|
||||||
import com.github.mikephil.charting.formatter.IValueFormatter;
|
import com.github.mikephil.charting.formatter.ValueFormatter;
|
||||||
import com.github.mikephil.charting.interfaces.datasets.IRadarDataSet;
|
import com.github.mikephil.charting.interfaces.datasets.IRadarDataSet;
|
||||||
import com.github.mikephil.charting.utils.ViewPortHandler;
|
|
||||||
import com.health.openscale.R;
|
import com.health.openscale.R;
|
||||||
import com.health.openscale.core.OpenScale;
|
import com.health.openscale.core.OpenScale;
|
||||||
import com.health.openscale.core.datatypes.ScaleMeasurement;
|
import com.health.openscale.core.datatypes.ScaleMeasurement;
|
||||||
@@ -59,8 +59,6 @@ import java.util.ArrayList;
|
|||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import androidx.fragment.app.Fragment;
|
|
||||||
|
|
||||||
public class StatisticsFragment extends Fragment implements FragmentUpdateListener {
|
public class StatisticsFragment extends Fragment implements FragmentUpdateListener {
|
||||||
|
|
||||||
private View statisticsView;
|
private View statisticsView;
|
||||||
@@ -321,10 +319,10 @@ public class StatisticsFragment extends Fragment implements FragmentUpdateListen
|
|||||||
RadarData dataAvgWeek = new RadarData(setsAvgWeek);
|
RadarData dataAvgWeek = new RadarData(setsAvgWeek);
|
||||||
dataAvgWeek.setValueTextSize(8f);
|
dataAvgWeek.setValueTextSize(8f);
|
||||||
dataAvgWeek.setDrawValues(false);
|
dataAvgWeek.setDrawValues(false);
|
||||||
dataAvgWeek.setValueFormatter(new IValueFormatter() {
|
dataAvgWeek.setValueFormatter(new ValueFormatter() {
|
||||||
@Override
|
@Override
|
||||||
public String getFormattedValue(float value, Entry entry, int dataSetIndex, ViewPortHandler viewPortHandler) {
|
public String getRadarLabel(RadarEntry radarEntry) {
|
||||||
FloatMeasurementView measurementView = (FloatMeasurementView) entry.getData();
|
FloatMeasurementView measurementView = (FloatMeasurementView) radarEntry.getData();
|
||||||
|
|
||||||
return measurementView.getValueAsString(true);
|
return measurementView.getValueAsString(true);
|
||||||
}
|
}
|
||||||
@@ -333,10 +331,10 @@ public class StatisticsFragment extends Fragment implements FragmentUpdateListen
|
|||||||
RadarData dataAvgMonth = new RadarData(setsAvgMonth);
|
RadarData dataAvgMonth = new RadarData(setsAvgMonth);
|
||||||
dataAvgMonth.setValueTextSize(8f);
|
dataAvgMonth.setValueTextSize(8f);
|
||||||
dataAvgMonth.setDrawValues(false);
|
dataAvgMonth.setDrawValues(false);
|
||||||
dataAvgMonth.setValueFormatter(new IValueFormatter() {
|
dataAvgMonth.setValueFormatter(new ValueFormatter() {
|
||||||
@Override
|
@Override
|
||||||
public String getFormattedValue(float value, Entry entry, int dataSetIndex, ViewPortHandler viewPortHandler) {
|
public String getRadarLabel(RadarEntry radarEntry) {
|
||||||
FloatMeasurementView measurementView = (FloatMeasurementView) entry.getData();
|
FloatMeasurementView measurementView = (FloatMeasurementView) radarEntry.getData();
|
||||||
|
|
||||||
return measurementView.getValueAsString(true);
|
return measurementView.getValueAsString(true);
|
||||||
}
|
}
|
||||||
|
@@ -19,6 +19,7 @@ package com.health.openscale.gui.views;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.graphics.Color;
|
import android.graphics.Color;
|
||||||
|
import android.graphics.RectF;
|
||||||
import android.preference.PreferenceManager;
|
import android.preference.PreferenceManager;
|
||||||
import android.util.AttributeSet;
|
import android.util.AttributeSet;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
@@ -31,10 +32,9 @@ import com.github.mikephil.charting.components.YAxis;
|
|||||||
import com.github.mikephil.charting.data.Entry;
|
import com.github.mikephil.charting.data.Entry;
|
||||||
import com.github.mikephil.charting.data.LineData;
|
import com.github.mikephil.charting.data.LineData;
|
||||||
import com.github.mikephil.charting.data.LineDataSet;
|
import com.github.mikephil.charting.data.LineDataSet;
|
||||||
import com.github.mikephil.charting.formatter.IAxisValueFormatter;
|
import com.github.mikephil.charting.formatter.ValueFormatter;
|
||||||
import com.github.mikephil.charting.formatter.IValueFormatter;
|
|
||||||
import com.github.mikephil.charting.interfaces.datasets.ILineDataSet;
|
import com.github.mikephil.charting.interfaces.datasets.ILineDataSet;
|
||||||
import com.github.mikephil.charting.utils.ViewPortHandler;
|
import com.github.mikephil.charting.utils.Utils;
|
||||||
import com.health.openscale.R;
|
import com.health.openscale.R;
|
||||||
import com.health.openscale.core.OpenScale;
|
import com.health.openscale.core.OpenScale;
|
||||||
import com.health.openscale.core.datatypes.ScaleMeasurement;
|
import com.health.openscale.core.datatypes.ScaleMeasurement;
|
||||||
@@ -227,6 +227,62 @@ public class ChartMeasurementView extends LineChart {
|
|||||||
return (int)(shortDate.getTime().getTime() / 1000000L);
|
return (int)(shortDate.getTime().getTime() / 1000000L);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void setCustomViewPortOffsets() {
|
||||||
|
float offsetLeft = 0f, offsetRight = 0f, offsetTop = 0f, offsetBottom = 0f;
|
||||||
|
|
||||||
|
RectF mOffsetsBuffer = new RectF();
|
||||||
|
calculateLegendOffsets(mOffsetsBuffer);
|
||||||
|
|
||||||
|
offsetLeft += mOffsetsBuffer.left;
|
||||||
|
offsetTop += mOffsetsBuffer.top;
|
||||||
|
offsetRight += mOffsetsBuffer.right;
|
||||||
|
offsetBottom += Math.max(70f, mOffsetsBuffer.bottom);
|
||||||
|
|
||||||
|
// offsets for y-labels
|
||||||
|
if (mAxisLeft.needsOffset()) {
|
||||||
|
offsetLeft += mAxisLeft.getRequiredWidthSpace(mAxisRendererLeft
|
||||||
|
.getPaintAxisLabels());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mAxisRight.needsOffset()) {
|
||||||
|
offsetRight += mAxisRight.getRequiredWidthSpace(mAxisRendererRight
|
||||||
|
.getPaintAxisLabels());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mXAxis.isEnabled() && mXAxis.isDrawLabelsEnabled()) {
|
||||||
|
|
||||||
|
float xLabelHeight = mXAxis.mLabelRotatedHeight + mXAxis.getYOffset();
|
||||||
|
|
||||||
|
// offsets for x-labels
|
||||||
|
if (mXAxis.getPosition() == XAxis.XAxisPosition.BOTTOM) {
|
||||||
|
|
||||||
|
offsetBottom += xLabelHeight;
|
||||||
|
|
||||||
|
} else if (mXAxis.getPosition() == XAxis.XAxisPosition.TOP) {
|
||||||
|
|
||||||
|
offsetTop += xLabelHeight;
|
||||||
|
|
||||||
|
} else if (mXAxis.getPosition() == XAxis.XAxisPosition.BOTH_SIDED) {
|
||||||
|
|
||||||
|
offsetBottom += xLabelHeight;
|
||||||
|
offsetTop += xLabelHeight;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
offsetTop += getExtraTopOffset();
|
||||||
|
offsetRight += getExtraRightOffset();
|
||||||
|
offsetBottom += getExtraBottomOffset();
|
||||||
|
offsetLeft += getExtraLeftOffset();
|
||||||
|
|
||||||
|
float minOffset = Utils.convertDpToPixel(mMinOffset);
|
||||||
|
|
||||||
|
setViewPortOffsets(
|
||||||
|
Math.max(minOffset, offsetLeft),
|
||||||
|
Math.max(minOffset, offsetTop),
|
||||||
|
Math.max(minOffset, offsetRight),
|
||||||
|
Math.max(minOffset, offsetBottom));
|
||||||
|
}
|
||||||
|
|
||||||
private Date convertShortInDate(int shortDate) {
|
private Date convertShortInDate(int shortDate) {
|
||||||
return new Date(shortDate * 1000000L);
|
return new Date(shortDate * 1000000L);
|
||||||
}
|
}
|
||||||
@@ -291,19 +347,23 @@ public class ChartMeasurementView extends LineChart {
|
|||||||
throw new IllegalArgumentException("view mode not implemented");
|
throw new IllegalArgumentException("view mode not implemented");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setAutoScaleMinMaxEnabled(true);
|
||||||
|
setCustomViewPortOffsets(); // set custom viewPortOffsets to avoid jitter on translating while auto scale is on
|
||||||
|
|
||||||
getXAxis().setGranularity(granularity);
|
getXAxis().setGranularity(granularity);
|
||||||
setVisibleXRangeMaximum(range);
|
setVisibleXRangeMaximum(range);
|
||||||
|
|
||||||
moveViewToX(getBinNr(lastMeasurement));
|
moveViewToX(getBinNr(lastMeasurement));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setXValueFormat(final ViewMode mode) {
|
private void setXValueFormat(final ViewMode mode) {
|
||||||
getXAxis().setValueFormatter(new IAxisValueFormatter() {
|
getXAxis().setValueFormatter(new ValueFormatter() {
|
||||||
private final SimpleDateFormat xValueFormat = new SimpleDateFormat();
|
private final SimpleDateFormat xValueFormat = new SimpleDateFormat();
|
||||||
private final Calendar calendar = Calendar.getInstance();
|
private final Calendar calendar = Calendar.getInstance();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getFormattedValue(float value, AxisBase axis) {
|
public String getAxisLabel(float value, AxisBase axis) {
|
||||||
calendar.setTime(new Date(0));
|
calendar.setTime(new Date(0));
|
||||||
|
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
@@ -476,7 +536,7 @@ public class ChartMeasurementView extends LineChart {
|
|||||||
private void addMeasurementLine(List<ILineDataSet> lineDataSets, List<Entry> lineEntries, FloatMeasurementView measurementView) {
|
private void addMeasurementLine(List<ILineDataSet> lineDataSets, List<Entry> lineEntries, FloatMeasurementView measurementView) {
|
||||||
LineDataSet measurementLine = new LineDataSet(lineEntries, measurementView.getName().toString());
|
LineDataSet measurementLine = new LineDataSet(lineEntries, measurementView.getName().toString());
|
||||||
measurementLine.setLineWidth(1.5f);
|
measurementLine.setLineWidth(1.5f);
|
||||||
measurementLine.setValueTextSize(8.0f);
|
measurementLine.setValueTextSize(10.0f);
|
||||||
measurementLine.setColor(measurementView.getColor());
|
measurementLine.setColor(measurementView.getColor());
|
||||||
measurementLine.setValueTextColor(ColorUtil.getTextColor(getContext()));
|
measurementLine.setValueTextColor(ColorUtil.getTextColor(getContext()));
|
||||||
measurementLine.setCircleColor(measurementView.getColor());
|
measurementLine.setCircleColor(measurementView.getColor());
|
||||||
@@ -488,9 +548,9 @@ public class ChartMeasurementView extends LineChart {
|
|||||||
measurementLine.setHighLightColor(Color.RED);
|
measurementLine.setHighLightColor(Color.RED);
|
||||||
measurementLine.setDrawCircles(prefs.getBoolean("pointsEnable", true));
|
measurementLine.setDrawCircles(prefs.getBoolean("pointsEnable", true));
|
||||||
measurementLine.setDrawValues(prefs.getBoolean("labelsEnable", true));
|
measurementLine.setDrawValues(prefs.getBoolean("labelsEnable", true));
|
||||||
measurementLine.setValueFormatter(new IValueFormatter() {
|
measurementLine.setValueFormatter(new ValueFormatter() {
|
||||||
@Override
|
@Override
|
||||||
public String getFormattedValue(float value, Entry entry, int dataSetIndex, ViewPortHandler viewPortHandler) {
|
public String getPointLabel(Entry entry) {
|
||||||
String prefix = new String();
|
String prefix = new String();
|
||||||
|
|
||||||
Object[] extraData = (Object[])entry.getData();
|
Object[] extraData = (Object[])entry.getData();
|
||||||
|
Reference in New Issue
Block a user