En respuesta a la pregunta original de Janusz, hay varias formas de lograr esto, todas las cuales varían en su nivel de dificultad y se han indicado a continuación. Usar una vista web es bueno, pero es muy limitado en términos de apariencia y control. Si está dibujando un mapa de bits desde un lienzo, las soluciones más versátiles que se han propuesto parecen ser las de MikeOrtiz, Robert Foss y / o lo que sugirió Jacob Nordfalk. Hay un gran ejemplo para la incorporación de la android-multitouch-controlador por PaulBourke , y es ideal para contar con el apoyo multitouch y AllTypes de vistas personalizadas.
Personalmente, si simplemente está dibujando un lienzo en un mapa de bits y luego lo muestra en el interior y en ImageView y desea poder acercarse y moverse con el toque múltiple, la solución de MikeOrtiz es la más fácil. Sin embargo, para mis propósitos, el código del Git que ha proporcionado parece funcionar solo cuando su clase TouchViewView personalizada ImageView es el único elemento secundario o proporciona los parámetros de diseño como:
android:layout_height="match_parent"
android:layout_height="match_parent"
Desafortunadamente debido a mi diseño de diseño, necesitaba "wrap_content" para "layout_height". Cuando lo cambié a esto, la imagen se recortó en la parte inferior y no pude desplazarme ni acercarme a la región recortada. Así que eché un vistazo a Source for ImageView solo para ver cómo Android implementó "onMeasure" y cambié MikeOrtiz para adaptarlo.
@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);
}
Aquí resolveSize (int, int) es una "Utilidad para conciliar un tamaño deseado con restricciones impuestas por un MeasureSpec, donde:
Parámetros:
- size How big the view wants to be
- MeasureSpec Constraints imposed by the parent
Devoluciones:
- The size this view should be."
Por lo tanto, esencialmente proporciona un comportamiento un poco más similar a la clase ImageView original cuando se carga la imagen. Se podrían realizar algunos cambios más para admitir una mayor variedad de pantallas que modifiquen la relación de aspecto. Pero por ahora espero que esto ayude. Gracias a MikeOrtiz por su código original, gran trabajo.