2013-01-15 18 views
10

Ho lavorato a un'app con layout complessi. Di recente ho capito che ho bisogno di rendere le parti o tutti i miei layout zoomabili.Crea layout Android e layout nidificati con zoomabile

Uno dei miei file XML principali ha un layout lineare con più layout nidificati all'interno di esso per posizionare correttamente le viste. C'è un modo semplice per rendere questo layout lineare e tutto all'interno di zoomable? O sarebbe più semplice ingrandire l'intero file di layout? Quali sono le mie opzioni?

risposta

1

Si potrebbe dare un'occhiata alle trasformazioni statiche. Qualsiasi ViewGroup o sottoclasse può essere personalizzato per applicare una trasformazione alle sue viste secondarie. Per abilitarlo, chiamare setStaticTransformationsEnabled(true) e quindi ignorare la richiamata getChildStaticTransformation() (docs link) nell'aspetto personalizzato ViewGroup. Puoi applicare qualsiasi trasformazione che ti piace, inclusa una scala per creare il tuo effetto zoom. Questa richiamata verrà richiamata ogni volta che la vista deve essere ridisegnata o invalidata.

Inoltre, fare attenzione quando si utilizza questo insieme all'accelerazione hardware. A seconda della frequenza con cui è necessario aggiornare le trasformazioni, è possibile che l'hardware non funzioni abbastanza per ridisegnare come previsto. In tal caso, sarà necessario abilitare i livelli software per questa gerarchia di viste.

+0

[esempio] (http://stackoverflow.com/questions/4261527/resizing-scaling-down-android-widgets-datepicker-and-timepicker) – Leonidos

4

Innanzitutto estendono quella classe a tale specifica vista

public class MyImageView extends ImageView{ 

Override seguente metodo.

@Override 
protected void onDraw(Canvas canvas) { 
super.onDraw(canvas); 
canvas.save(); 

canvas.scale(mScaleFactor, mScaleFactor, midPoint.x, midPoint.y); 
if(appInitialized) { 

hsSide.draw(canvas); 
scaleA.draw(canvas); 
scaleB.draw(canvas); 

    } 

canvas.restore(); 


} 

Creare un rilevatore di gesti in grado di rilevare le dimensioni dell'oggetto ingrandito e limitare per evitare sovrapposizioni.

 private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener { 

@Override 
public boolean onScale(ScaleGestureDetector detector) { 

    mScaleFactor *= detector.getScaleFactor(); 
    pivotX = detector.getFocusX(); 
    pivotY = detector.getFocusY(); 
    // Don't let the object get too small or too large. 
    mScaleFactor = Math.max(0.8f, Math.min(mScaleFactor, 2.0f)); 

    invalidate(); 
    return true; 
    } 
} 

Al termine inizializzare l'oggetto

ScaleGestureDetector mScaleDetector; 



    mScaleDetector = new ScaleGestureDetector(context, new ScaleListener()); 
+0

Grazie ci proverò! – Peter

+0

Funzionerà se il layout radice che sto cercando di fare non è una vista di immagini? È un layout con altre viste e layout al suo interno – Peter

+0

È possibile estenderlo con qualsiasi classe di vista. La scala gestrue rileverà le dimensioni della vista e puoi limitarti a sovrapporre di conseguenza un'altra vista: – Jan