Я пытаюсь повторить то, что 'Buffalo Chart Demo' делает в их диаграмме. Идея состоит в том, что масштабирование работает только на XAxis и YAxis, динамически масштабируемых для отображения только видимого диапазона XAxis.
Я написал код, который использует класс Listen для обнаружения перетаскивания и масштабирования диаграммы. Во время этого он попытается изменить размер диапазона Yaxis, чтобы увеличить диапазон отображаемых значений:
public void setUpGraph()
{
{ // // Chart Style // //
// background color
chart.setBackgroundColor(Color.WHITE);
// disable description text
chart.getDescription().setEnabled(false);
// enable touch gestures
chart.setTouchEnabled(true);
// set listeners
//chart.setOnChartValueSelectedListener(this);
chart.setDrawGridBackground(false);
// enable scaling and dragging
chart.setDragEnabled(true);
// chart.setScaleEnabled(true);
chart.setScaleXEnabled(true);
chart.setScaleYEnabled(false);
// force pinch zoom along both axis
//chart.setPinchZoom(true);
}
XAxis xAxis;
{ // // X-Axis Style // //
xAxis = chart.getXAxis();
// vertical grid lines
//xAxis.enableGridDashedLine(10f, 10f, 0f);
}
YAxis yAxis;
{ // // Y-Axis Style // //
yAxis = chart.getAxisLeft();
// disable dual axis (only use LEFT axis)
chart.getAxisRight().setEnabled(false);
// horizontal grid lines
yAxis.enableGridDashedLine(10f, 10f, 0f);
// axis range
// yAxis.setAxisMaximum(300f);
// yAxis.setAxisMinimum(150f);
chart.setVisibleYRange(150 ,250,yAxis.getAxisDependency());
}
{ // // Create Limit Lines // //
// draw limit lines behind data instead of on top
yAxis.setDrawLimitLinesBehindData(true);
xAxis.setDrawLimitLinesBehindData(true);
//xAxis.addLimitLine(llXAxis);
}
//chart.setAutoScaleMinMaxEnabled(false);
chart.zoom(100,1,0,0);
chart.setOnChartGestureListener(this);
}
@Override
public void onChartTranslate(MotionEvent me, float dX, float dY) {
adjustChartDisplay();
}
public void adjustChartDisplay()
{
float xmin = chart.getLowestVisibleX();
float xmax = chart.getHighestVisibleX();
float ymin = Float.MAX_VALUE;
float ymax = Float.MIN_VALUE;
for(AggregatedWeightRecord wr:live_data.getValue())
{
if(xmin <= wr.getDay() && wr.getDay() <= xmax)
{
ymin = Math.min(ymin,(float)wr.getMinimumWeight());
ymax = Math.max(ymax,(float)wr.getMaximumWeight());
}
}
// ymax += 2;
// ymin -= 2;
Log.i("TEST",""+ymin+" " + ymax);
chart.getAxisLeft().setAxisMinimum(ymin);
chart.getAxisLeft().setAxisMaximum(ymax);
chart.invalidate();
}
}
Я также вызываю это на всех других вызываемых событиях. Однако это не работает :(. Когда я делаю простое перетаскивание, никаких изменений не происходит. Изменения происходят только в КОНЦЕ МАСШТАБИРОВАНИЯ.
Что мне не хватает? Какие решения и методы я могу попробовать?