2015-05-14 10 views
19

Sto disegnando un suggerimento dopo aver fatto clic all'interno di un grafico a barre personalizzato (creato con MPAndroidChart). La gerarchia della vista è la seguenteVisualizza limiti esterni non disegnati correttamente

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

Mentre la vista si trova all'interno del grafico o suo fratello inmediate, everthing sembra buono. Ma nel momento in cui si scontra con suo fratello, il tooltip viene troncato

enter image description here

Utilizzando HierarchyViewer posso vedere che il contenuto è presente, ma non è disegnato.

Al fine di ottenere il ritaglio, sto usando questo codice all'interno di disegnare

@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(); 
    } 

Se cambio Op a Region.Op.Replace, il tooltip è disegnare correttamente, ma sostituisce il contenuto Toolbar, invece di scorrere sotto di esso.

enter image description here

+0

Potrebbe inviare i codici sorgente di questo? Sembra fantastico, voglio dargli un'occhiata. Grazie comunque. – SilentKnight

+0

Grazie! Ma temo di non poterlo fare, mi dispiace. Io uso https://github.com/PhilJay/MPAndroidChart per i grafici, ma ho personalizzato alcune parti (specialmente le etichette X) – Maragues

+1

Probabilmente non è il tuo unico problema, ma penso che tu stia abusando di canvas.save(). Non dovresti chiamarlo prima della tua prima traduzione, e poi chiamare il ripristino dopo aver finito, piuttosto che chiamare di nuovo il traduttore nella direzione negativa. – charliebeckwith

risposta

1

Avrete bisogno i limiti della zona in cui si vuole essere in grado di disegnare il tooltip, e sto supponendo che sarebbe uno ScrollView. Quindi puoi intersecare i limiti del tooltip con lo scroll per capire quale dovrebbe essere il clipping; e se dovrebbe essere disegnato a tutti.

di spiegarlo in codice sarebbe qualcosa di simile (non testata):

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); 
} 
Problemi correlati