2010-10-07 19 views
10

Volevo creare una galleria con le immagini. Le immagini all'interno della galleria devono essere zoomabili e selezionabili. Potrei essere in grado di pizzicare con lo zoom un'immagine ma non riuscire a impostare i limiti dello zoom e impedire che l'immagine venga spostata dallo schermo. Ho usato il seguente codice per ingrandire un'immagine: http://code.google.com/p/4chan-image-browser/source/browse/src/se/robertfoss/MultiTouch/TouchImageView.java?spec=svnd3e623ddeb6f9e97d9eba2c7aaa7c4567a3822b5&r=d3e623ddeb6f9e97d9eba2c7aaa7c4567a3822b5ImageView Scala pinch-zoom Limiti e pan bound

Primo approccio: ho usato TouchImageView di fornire immagini in galleria, questo mi permette di pizzicare zoom ma non riesco a scorrere la galleria. Io non posso distinguere tra 'evento a scheda singola' e 'scheda per scorrere l'evento'.

Secondo approccio: ImageView utilizzato per fornire immagini alla galleria e, se l'utente fa clic su una qualsiasi delle voci della galleria, visualizza l'immagine selezionata in TouchImageView, dove l'utente può ingrandire un'immagine. Ma questo mi impedisce anche di scorrere la vista della galleria. E anche come impostare i limiti dello zoom e il pan bound sull'immagine selezionata?

risposta

3

È possibile impostare limite dello zoom con l'aggiunta di queste righe per ACTION_MOVE, modalità == ZOOM:

float[] f = new float[9]; 
matrix.getValues(f); 

float scaleX = f[Matrix.MSCALE_X]; 
float scaleY = f[Matrix.MSCALE_Y]; 
if (scaleX > MAX_SCALE || scaleY > MAX_SCALE) return true; 

Allo stesso modo, aggiungere linee di ACTION_MOVE, modalità == DRAG che tiene conto della posizione originale della vostra immagine, la lunghezza tradotta e quindi confrontarli con i limiti.

+0

Hai l'idea giusta chiamando 'matrix.getValues ​​(f);'. Tuttavia, la soluzione non è quella di restituire true, in quanto ciò bloccherà semplicemente lo schermo. Piuttosto se il valore di ridimensionamento sta per superare MAX_SCALE, quindi impostare il valore di ridimensionamento uguale a MAX_SCALE. Controlla la mia risposta qui sotto per una piena implementazione usando questo metodo. –

2

Ho fornito una risposta here che aggiunge il panning, lo zoom e il rilevamento dei confini a ImageView.

20

Questo ha risolto il problema del limite di zoom per me. Dopo che l'immagine è stata ingrandita/rimpicciolita fino al limite, smette semplicemente di andare oltre. È anche liscio e non ci sono ritardi. 0,7 e 2,0 sono i livelli di zoom minimi e massimi.

.... 
} else if (mode == ZOOM) { 
    float[] f = new float[9]; 

    float newDist = spacing(event); 
    if (newDist > 10f) { 
      matrix.set(savedMatrix); 
      float tScale = newDist/dist; 
      matrix.postScale(tScale, tScale, mid.x, mid.y); 
    } 

    matrix.getValues(f); 
    float scaleX = f[Matrix.MSCALE_X]; 
    float scaleY = f[Matrix.MSCALE_Y]; 

    if(scaleX <= 0.7f) { 
      matrix.postScale((0.7f)/scaleX, (0.7f)/scaleY, mid.x, mid.y); 
    } else if(scaleX >= 2.5f) { 
      matrix.postScale((2.5f)/scaleX, (2.5f)/scaleY, mid.x, mid.y); 
    } 
} 
....   
+1

salvi la mia giornata cara! dovrebbe essere accettato risposta! –

3

hanno cercato di utilizzare questo codice qui sotto e anche se funziona ho scoperto che stava causando piccoli valori incrementali ad accumularsi a Trans X e Y Trans conduce al quadro che si muovono lentamente fuori dallo schermo.

if(scaleX <= 0.7f) 
      matrix.postScale((0.7f)/scaleX, (0.7f)/scaleY, mid.x, mid.y); 
    else if(scaleX >= 2.5f) 
      matrix.postScale((2.5f)/scaleX, (2.5f)/scaleY, mid.x, mid.y); 

Ho fissato questo essere memorizzando una matrice originale in un galleggiante [] (1,0,0,0,1,0,0,0,1) e la reimpostazione della matrice posteriore a questi valori quando scaleX < 1. Spero che questo aiuti qualcun altro un giorno :)

if(scaleX <= 1.0f) {         
    float[] originalmatrixvalues = new float[] {1f, 0f, 0f, 0f, 1f, 0f, 0f, 0f, 1f}; 
    matrix.setValues(originalmatrixvalues); 
} else if(scaleX >= 2.5f) { 
    matrix.postScale((2.5f)/scaleX, (2.5f)/scaleY, mid.x, mid.y); 
} 
Problemi correlati