Dalam Respons terhadap pertanyaan awal Janusz, ada beberapa cara untuk mencapai ini yang semuanya bervariasi dalam tingkat kesulitannya dan telah dinyatakan di bawah ini. Menggunakan tampilan web itu bagus, tetapi sangat terbatas dalam hal tampilan dan rasa serta kemampuan kontrol. Jika Anda menggambar bitmap dari kanvas, solusi paling serbaguna yang telah diusulkan tampaknya adalah MikeOrtiz, Robert Foss's dan / atau apa yang disarankan Jacob Nordfalk. Ada contoh yang bagus untuk menggabungkan android-multitouch-controller oleh PaulBourke , dan sangat bagus untuk memiliki dukungan multi-touch dan semua jenis pandangan kustom.
Secara pribadi, jika Anda hanya menggambar kanvas ke bitmap dan kemudian menampilkannya di dalam dan ImageView dan ingin dapat memperbesar dan bergerak menggunakan multi touch, saya menemukan solusi MikeOrtiz sebagai yang termudah. Namun, untuk tujuan saya, kode dari Git yang ia sediakan tampaknya hanya berfungsi ketika kelas TouchImageView kustom ImageView adalah satu-satunya anak atau menyediakan tata letak params seperti:
android:layout_height="match_parent"
android:layout_height="match_parent"
Sayangnya karena desain tata letak saya, saya perlu "wrap_content" untuk "layout_height". Ketika saya mengubahnya ke ini gambar dipotong di bagian bawah dan saya tidak bisa menggulir atau memperbesar ke daerah yang dipotong. Jadi saya melihat Sumber untuk ImageView hanya untuk melihat bagaimana Android menerapkan "onMeasure" dan mengubah MikeOrtiz sesuai.
@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);
}
Di sini resolSize (int, int) adalah "Utilitas untuk merekonsiliasi ukuran yang diinginkan dengan batasan yang diberlakukan oleh MeasureSpec, di mana:
Parameter:
- size How big the view wants to be
- MeasureSpec Constraints imposed by the parent
Pengembalian:
- The size this view should be."
Jadi intinya memberikan perilaku yang sedikit lebih mirip dengan kelas ImageView asli ketika gambar dimuat. Beberapa perubahan lebih lanjut dapat dilakukan untuk mendukung variasi layar yang lebih besar yang mengubah rasio aspek. Tetapi untuk sekarang saya harap ini membantu. Terima kasih kepada MikeOrtiz untuk kode aslinya, kerja bagus.