Androidplot Optimization

It seems that the Androidplot site / forums (androidplot.com) are not available, so I will try to ask this question here.

I have multiple scaling and scrolling. Similar code is http://mlepicki.com/2012/03/androidplot-multitouch-zoom-scroll/ except that I have a histogram instead. However, with 100 data points, it has a noticeable lag. Even with 10 bars just show. It looks like drawing / calculating / etc of all bars.

Any idea on how I could optimize this?

I cannot use hardware rendering since I want to support Android 2.1 and the library does not support it (it breaks).

+6
source share
2 answers

BarRenderer been optimized quite a bit in Androidplot 1.4.0, so the custom Renderer is no longer needed.

+1
source

I created my own renderer to solve my delay problems. It seems to be much smoother. This code is based on version 0.5. I don’t know if it works on v0.51.

 import android.graphics.*; import com.androidplot.exception.PlotRenderException; import com.androidplot.series.XYSeries; import com.androidplot.util.ValPixConverter; import com.androidplot.xy.BarFormatter; import com.androidplot.xy.XYPlot; import com.androidplot.xy.XYSeriesRenderer; import java.util.List; import java.util.Map; import java.util.TreeMap; /** * Renders a point as a Bar */ public class OptimisedBarRenderer extends XYSeriesRenderer<BarFormatter> { private BarWidthStyle style = BarWidthStyle.FIXED_WIDTH; private float barWidth = 5; public OptimisedBarRenderer(XYPlot plot) { super(plot); } /** * Sets the width of the bars draw. * @param barWidth */ public void setBarWidth(float barWidth) { this.barWidth = barWidth; } private final TreeMap<Number, XYSeries> tempSeriesMap = new TreeMap<Number, XYSeries>(); @Override public void onRender(Canvas canvas, RectF plotArea) throws PlotRenderException { int longest = getLongestSeries(); if(longest == 0) { return; // no data, nothing to do. } tempSeriesMap.clear(); for(int i = 0; i < longest; i++) { tempSeriesMap.clear(); List<XYSeries> seriesList = getPlot().getSeriesListForRenderer(this.getClass()); for(XYSeries series : seriesList) { if(i < series.size()) { tempSeriesMap.put(series.getY(i), series); } } drawBars(canvas, plotArea, tempSeriesMap, i); } } @Override public void doDrawLegendIcon(Canvas canvas, RectF rect, BarFormatter formatter) { canvas.drawRect(rect, formatter.getFillPaint()); canvas.drawRect(rect, formatter.getBorderPaint()); } private int getLongestSeries() { int longest = 0; List<XYSeries> seriesList = getPlot().getSeriesListForRenderer(this.getClass()); if(seriesList == null) return 0; for(XYSeries series :seriesList) { int seriesSize = series.size(); if(seriesSize > longest) { longest = seriesSize; } } return longest; } private void drawBars(Canvas canvas, RectF plotArea, TreeMap<Number, XYSeries> seriesMap, int x) { // Paint p = new Paint(); // p.setColor(Color.RED); Object[] oa = seriesMap.entrySet().toArray(); Map.Entry<Number, XYSeries> entry; Number yVal = null; Number xVal = null; float halfWidth = barWidth * 0.5f; for(int i = oa.length-1; i >= 0; i--) { entry = (Map.Entry<Number, XYSeries>) oa[i]; XYSeries tempEntry = entry.getValue(); if(tempEntry != null) { yVal = tempEntry.getY(x); xVal = tempEntry.getX(x); if (yVal != null && xVal != null) { // make sure there a real value to draw switch (style) { case FIXED_WIDTH: float pixX = ValPixConverter.valToPix(xVal.doubleValue(), getPlot().getCalculatedMinX().doubleValue(), getPlot().getCalculatedMaxX().doubleValue(), plotArea.width(), false) + plotArea.left; float left = pixX - halfWidth; float right = pixX + halfWidth; boolean offScreen = left > plotArea.right || right < plotArea.left; if(!offScreen){ float pixY = ValPixConverter.valToPix(yVal.doubleValue(), getPlot().getCalculatedMinY().doubleValue(), getPlot().getCalculatedMaxY().doubleValue(), plotArea.height(), true) + plotArea.top; BarFormatter formatter = getFormatter(tempEntry); if(Math.abs (left - right) > 1f){//Don't draw as it will be hidden anyway. canvas.drawRect(left, pixY, right, plotArea.bottom, formatter.getFillPaint()); } canvas.drawRect(left, pixY, right, plotArea.bottom, formatter.getBorderPaint()); } break; default: throw new UnsupportedOperationException("Not yet implemented."); } } } } } } 
+6
source

Source: https://habr.com/ru/post/913084/


All Articles