tabla significa sacar quimica que protones periodica numero masico isotopos ejemplos como atomico android charts mpandroidchart

android - sacar - que significa n en quimica



MPAndroidChart: ¿es posible controlar el índice Z de los elementos del gráfico? (1)

Me gustaría tener el siguiente orden de dibujo en mi MPAndroidChart (de abajo hacia arriba):

  1. Línea de conexión de datos
  2. Límite de línea
  3. Puntos de datos

¿Es posible? com.github.mikephil.charting.components.AxisBase#setDrawLimitLinesBehindData el método com.github.mikephil.charting.components.AxisBase#setDrawLimitLinesBehindData . Está funcionando como se esperaba, excepto en un caso. Cuando el valor Y de todos los puntos de datos es el mismo, el efecto es:

o esto:

Me gustaría que se vea así:

Las primeras 2 imágenes son de la biblioteca Android de MPAndroidChart . El tercero es desde el puerto iOS de la biblioteca: Gráficos

Miré el pedido o dibujé el gráfico en las versiones de Android e iOS y tienen el mismo aspecto.

Preguntas:

  1. ¿Es posible controlar el orden de dibujo?
  2. ¿Cuál es la diferencia entre las versiones del sistema?
  3. ¿Hay alguna otra biblioteca de código abierto que pueda hacer eso?

Información adicional: todas las imágenes, líneas, círculos son dibujados por la biblioteca, las imágenes personalizadas no se utilizan.


Al igual que en una respuesta anterior, aquí no hay una API pública expuesta para establecer directamente el índice Z de las diversas características del dibujo.

En cambio, los componentes se dibujan en orden en el lienzo con los componentes posteriores dibujados sobre los anteriores. Esto significa que usted cambia el orden de representación, puede cambiar el índice z.

Usted dice que le gustaría el siguiente orden de dibujo:

  1. Línea de conexión de datos
  2. Límite de línea
  3. Puntos de datos

Busquemos los métodos en el código fuente que tratan con cada uno de ellos:

  1. La línea de conexión de datos se dibuja dentro de LineChartRenderer en un método llamado:

    protected drawLinear(Canvas c, ILineDataSet dataSet)

  2. La línea límite se dibuja dentro de XAxisRenderer llamado:

    public void renderLimitLines(Canvas c)

  3. Los puntos de datos (círculos) se dibujan dentro de LineChartRenderer en un método que se ve así:

    public void drawExtras(Canvas c)

El orden de llamada de estos tres métodos se determina dentro de BarLineChartBase en el método BarLineChartBase desde la View de Android:

protected onDraw(Canvas canvas);

Entonces, para obtener el pedido que desea, simplemente tendrá que volver a organizar el orden de llamada de los 3 métodos anteriores en onDraw(Canvas canvas) :

Aquí está el código completo para un gráfico de líneas personalizado que debe cumplir con el requisito. Por diseño, igual tendrá que llamar:

com.github.mikephil.charting.components.AxisBase#setDrawLimitLinesBehindData

Pero puede eliminar fácilmente las 3 instrucciones if y codificar el orden si así lo desea.

CustomZIndexBarLineBase.java

import android.content.Context; import android.graphics.Canvas; import android.util.AttributeSet; import com.github.mikephil.charting.charts.BarLineChartBase; import com.github.mikephil.charting.data.LineData; /** * Created by David on 11/01/2017. */ public class CustomZIndexLineChartBase extends BarLineChartBase<LineData> { public CustomZIndexLineChartBase(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public CustomZIndexLineChartBase(Context context, AttributeSet attrs) { super(context, attrs); } public CustomZIndexLineChartBase(Context context) { super(context); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (mData == null) return; // execute all drawing commands drawGridBackground(canvas); if (mAxisLeft.isEnabled()) mAxisRendererLeft.computeAxis(mAxisLeft.mAxisMinimum, mAxisLeft.mAxisMaximum, mAxisLeft.isInverted()); if (mAxisRight.isEnabled()) mAxisRendererRight.computeAxis(mAxisRight.mAxisMinimum, mAxisRight.mAxisMaximum, mAxisRight.isInverted()); if (mXAxis.isEnabled()) mXAxisRenderer.computeAxis(mXAxis.mAxisMinimum, mXAxis.mAxisMaximum, false); mXAxisRenderer.renderAxisLine(canvas); mAxisRendererLeft.renderAxisLine(canvas); mAxisRendererRight.renderAxisLine(canvas); if (mAutoScaleMinMaxEnabled) { autoScale(); } mXAxisRenderer.renderGridLines(canvas); mAxisRendererLeft.renderGridLines(canvas); mAxisRendererRight.renderGridLines(canvas); if (mXAxis.isDrawLimitLinesBehindDataEnabled()) mXAxisRenderer.renderLimitLines(canvas); if (mAxisLeft.isDrawLimitLinesBehindDataEnabled()) mAxisRendererLeft.renderLimitLines(canvas); if (mAxisRight.isDrawLimitLinesBehindDataEnabled()) mAxisRendererRight.renderLimitLines(canvas); int clipRestoreCount = canvas.save(); canvas.clipRect(mViewPortHandler.getContentRect()); mRenderer.drawData(canvas); //NOTE: draws line between points if (valuesToHighlight()) mRenderer.drawHighlighted(canvas, mIndicesToHighlight); canvas.restoreToCount(clipRestoreCount); //NOTE: draws limit line if (!mXAxis.isDrawLimitLinesBehindDataEnabled()) mXAxisRenderer.renderLimitLines(canvas); if (!mAxisLeft.isDrawLimitLinesBehindDataEnabled()) mAxisRendererLeft.renderLimitLines(canvas); if (!mAxisRight.isDrawLimitLinesBehindDataEnabled()) mAxisRendererRight.renderLimitLines(canvas); mRenderer.drawExtras(canvas); //NOTE: draws circles mXAxisRenderer.renderAxisLabels(canvas); mAxisRendererLeft.renderAxisLabels(canvas); mAxisRendererRight.renderAxisLabels(canvas); if (isClipValuesToContentEnabled()) { clipRestoreCount = canvas.save(); canvas.clipRect(mViewPortHandler.getContentRect()); mRenderer.drawValues(canvas); canvas.restoreToCount(clipRestoreCount); } else { mRenderer.drawValues(canvas); } mLegendRenderer.renderLegend(canvas); drawDescription(canvas); drawMarkers(canvas); } }

CustomZIndexLineChart.java

import android.content.Context; import android.graphics.Canvas; import android.util.AttributeSet; import com.github.mikephil.charting.data.LineData; import com.github.mikephil.charting.interfaces.dataprovider.LineDataProvider; import com.github.mikephil.charting.renderer.LineChartRenderer; /** * Created by David on 11/01/2017. */ public class CustomZIndexLineChart extends CustomZIndexLineChartBase implements LineDataProvider { public CustomZIndexLineChart(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public CustomZIndexLineChart(Context context, AttributeSet attrs) { super(context, attrs); } public CustomZIndexLineChart(Context context) { super(context); } @Override protected void init() { super.init(); mRenderer = new LineChartRenderer(this, mAnimator, mViewPortHandler); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); } @Override public LineData getLineData() { return mData; } @Override protected void onDetachedFromWindow() { // releases the bitmap in the renderer to avoid oom error if (mRenderer != null && mRenderer instanceof LineChartRenderer) { ((LineChartRenderer) mRenderer).releaseBitmap(); } super.onDetachedFromWindow(); } }