studio pie chart barchart android android-canvas android-custom-view mpandroidchart

pie - line chart in android



Ver fuera de lĂ­mites no dibujar correctamente (1)

Estoy dibujando una información sobre herramientas después de hacer clic dentro de un gráfico de barras personalizado (creado con MPAndroidChart). La jerarquía de vistas es la siguiente

<LinearLayout> <TextView text=Move & Max Pain/> <RelativeLayout with 2 textviews> <chart clipToChildren=false clipToPadding=false /> </LinearLayout>

Mientras que la Vista está dentro de la Carta o su hermano inmediato, todo se ve bien. Pero en el momento en que choca con su hermano, la información sobre herramientas se trunca.

Al usar HierarchyViewer puedo ver que el contenido está presente, pero no está dibujado.

Para obtener el recorte, estoy usando este código dentro del dibujo

@Override public void draw(Canvas canvas, float posx, float posy) { // take offsets into consideration posx += getXOffset(); posy += getYOffset(); canvas.save(); // translate to the correct position and draw canvas.translate(posx, posy); Rect clipBounds = canvas.getClipBounds(); clipBounds.inset(0, -getHeight()); canvas.clipRect(clipBounds, Region.Op.INTERSECT); draw(canvas); canvas.translate(-posx, -posy); canvas.restore(); }

Si cambio Op. Por Región. Reemplazar, la información sobre herramientas se dibuja correctamente pero reemplaza el contenido de la barra de herramientas, en lugar de desplazarse debajo de ella.


Necesitará los límites del área en la que desea poder dibujar la información sobre herramientas, y supongo que sería una vista de desplazamiento. Luego, puede cruzar los límites de la información sobre herramientas con el desplazamiento para averiguar cuál debería ser el recorte; Y si se debe dibujar en absoluto.

Para explicarlo en código sería algo como esto (no probado):

Rect scrollViewRect; // the bounds of your scrollview Rect tooltipRect; // the bounds of your tooltip bool intersects = tooltipRect.intersect(scrollViewRect) if(intersects) { canvas.clipRect(tooltipRect, Region.Op.REPLACE); draw(canvas); }