Janusz'un orijinal sorusuna yanıt olarak, bunların hepsinin zorluk seviyelerine göre değişen ve aşağıda belirtilmiş olan birkaç yolu vardır. Bir web görünümü kullanmak iyidir, ancak görünüm ve his ve kontrol edilebilirlik açısından çok sınırlıdır. Bir tuvalden bir bitmap çiziyorsanız, önerilen en çok yönlü çözümler MikeOrtiz, Robert Foss ve / veya Jacob Nordfalk'ın önerdiği gibi görünüyor. PaulBourke'nin android-multitouch-denetleyicisini dahil etmek için harika bir örnek var ve çoklu dokunmatik desteğe ve özel görünümlerin tüm sahip olmak için harika.
Şahsen, sadece bir tuvali bir bitmap'e çizip sonra onu ve ImageView'i görüntülüyorsanız ve çoklu dokunma kullanarak yakınlaştırıp hareket edebilmek istiyorsanız, MikeOrtiz'in çözümünü en kolay olarak buluyorum. Ancak, benim amacım için onun Git Git kodu sadece onun TouchImageView özel ImageView sınıfı tek çocuk olduğunda veya düzen parametrelerini sağlamak gibi çalışıyor gibi görünüyor:
android:layout_height="match_parent"
android:layout_height="match_parent"
Ne yazık ki benim düzen tasarımı nedeniyle, "layout_height" için "wrap_content" gerekiyordu. Bunu değiştirdiğimde görüntü alttan kırpılmıştı ve kırpılan bölgeye kaydırılamıyor veya zum yapamıyordum. Bu yüzden, Android'in "onMeasure" uygulamasını nasıl uyguladığını ve MikeOrtiz'in uygun olmasını nasıl değiştirdiğini görmek için ImageView Kaynağına baktım.
@Override
protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec)
{
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
//**** ADDED THIS ********/////
int w = (int) bmWidth;
int h = (int) bmHeight;
width = resolveSize(w, widthMeasureSpec);
height = resolveSize(h, heightMeasureSpec);
//**** END ********///
// width = MeasureSpec.getSize(widthMeasureSpec); // REMOVED
// height = MeasureSpec.getSize(heightMeasureSpec); // REMOVED
//Fit to screen.
float scale;
float scaleX = (float)width / (float)bmWidth;
float scaleY = (float)height / (float)bmHeight;
scale = Math.min(scaleX, scaleY);
matrix.setScale(scale, scale);
setImageMatrix(matrix);
saveScale = 1f;
// Center the image
redundantYSpace = (float)height - (scale * (float)bmHeight) ;
redundantXSpace = (float)width - (scale * (float)bmWidth);
redundantYSpace /= (float)2;
redundantXSpace /= (float)2;
matrix.postTranslate(redundantXSpace, redundantYSpace);
origWidth = width - 2 * redundantXSpace;
origHeight = height - 2 * redundantYSpace;
// origHeight = bmHeight;
right = width * saveScale - width - (2 * redundantXSpace * saveScale);
bottom = height * saveScale - height - (2 * redundantYSpace * saveScale);
setImageMatrix(matrix);
}
Burada resolSize (int, int), "MeasureSpec tarafından uygulanan kısıtlamalarla istenen bir boyutu uzlaştırmak için bir yardımcı programdır, burada:
Parametreler:
- size How big the view wants to be
- MeasureSpec Constraints imposed by the parent
İadeler:
- The size this view should be."
Bu nedenle, aslında görüntü yüklendiğinde orijinal ImageView sınıfına biraz daha benzer bir davranış sağlar. En boy oranını değiştiren çok çeşitli ekranları desteklemek için bazı değişiklikler yapılabilir. Ama şimdilik umarım bu yardımcı olur. MikeOrtiz'e orijinal kodu için teşekkürler, harika çalışmalar.