2010-10-07 15 views
10

Chciałem stworzyć galerię ze zdjęciami. Obrazy w galerii powinny być powiększane i można je wyświetlać. Mogłem powiększyć obraz, ale nie mogłem ustawić granic zoomu i zapobiec przesunięciu obrazu z ekranu. Użyłem poniższy kod, aby powiększyć obraz: http://code.google.com/p/4chan-image-browser/source/browse/src/se/robertfoss/MultiTouch/TouchImageView.java?spec=svnd3e623ddeb6f9e97d9eba2c7aaa7c4567a3822b5&r=d3e623ddeb6f9e97d9eba2c7aaa7c4567a3822b5ImageView Skalowanie-zoom Skala Granice i panoramy

Pierwsze podejście: użyłem TouchImageView dostarczyć zdjęcia do galerii, to pozwala mi pinch zoom ale nie można przewijać galerii. tzn. nie mogę rozróżnić między zdarzeniem z jedną kartą i kartą, aby przewinąć wydarzenie.

Drugie podejście: Wykorzystano ImageView do dostarczania zdjęć do galerii, a jeśli użytkownik kliknie na którejkolwiek z pozycji galerii, wyświetla wybrany obraz w TouchImageView, gdzie użytkownik może uszczypnąć i powiększyć obraz. Ale to także uniemożliwia mi przewijanie widoku galerii. A także jak ustawić limity zoomu i przesunąć granice na wybranym obrazie?

Odpowiedz

3

Można ustawić maksymalne zbliżenie dodając te linie do ACTION_MOVE, tryb == 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; 

Podobnie dodać wiersze do ACTION_MOVE, tryb == DRAG, który bierze pod uwagę pierwotną lokalizację obrazu, przetłumaczyć długość, a następnie porównać je do granic.

+0

Masz dobry pomysł wywoływania 'matrix.getValues ​​(f);'. Jednak rozwiązaniem nie jest zwracanie wartości true, ponieważ spowoduje to po prostu zatrzymanie ekranu. Raczej, jeśli wartość skalowania ma wkrótce przekroczyć wartość MAX_SCALE, ustaw wartość skalowania równą MAX_SCALE. Sprawdź poniższą odpowiedź, aby uzyskać pełną implementację za pomocą tej metody. –

2

Podałem odpowiedź here, która dodaje panoramowanie, powiększanie i wykrywanie granic do ImageView.

20

Naprawiono dla mnie problem z limitem powiększenia. Po powiększeniu/zmniejszeniu obrazu, po prostu przestaje iść dalej. Jest również gładki i nie ma opóźnień. 0.7 i 2.0 to minimalne i maksymalne poziomy zoomu.

.... 
} 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

oszczędzasz mój dzień kochany! należy przyjąć odpowiedź! –

3

Próbowałem przy użyciu tego kodu poniżej, a mimo to działa Okazało się, że to było przyczyną małe wartości pierwotnych, które gromadzą się w Trans X i Y Trans prowadzi do obrazu powoli ruszania ekran.

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); 

I ustalony ten można przechowywać w oryginalnej matrycy float [] (1,0,0,0,1,0,0,0,1) i resetowanie matrycy z powrotem do tych wartości, gdy scaleX < 1. Mam nadzieję, że to pomoże komuś innemu dzień :)

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