En réponse à la question originale de Janusz, il existe plusieurs façons d'y parvenir, qui varient toutes selon leur niveau de difficulté et ont été décrites ci-dessous. L'utilisation d'une vue Web est bonne, mais elle est très limitée en termes de look and feel et de contrôlabilité. Si vous dessinez une image bitmap à partir d'un canevas, les solutions les plus polyvalentes qui ont été proposées semblent être celles de MikeOrtiz, Robert Foss et / ou ce que Jacob Nordfalk a suggéré. Il existe un excellent exemple pour incorporer le contrôleur android-multitouch de PaulBourke , et est idéal pour avoir le support multi-touch et tous les types de vues personnalisées.
Personnellement, si vous dessinez simplement un canevas sur une image bitmap puis que vous l'affichez à l'intérieur et ImageView et que vous souhaitez pouvoir zoomer et vous déplacer en utilisant le multi-touch, je trouve la solution de MikeOrtiz la plus simple. Cependant, pour mes besoins, le code du Git qu'il a fourni semble fonctionner uniquement lorsque sa classe ImageView personnalisée TouchImageView est le seul enfant ou fournit les paramètres de mise en page comme:
android:layout_height="match_parent"
android:layout_height="match_parent"
Malheureusement, en raison de ma conception de mise en page, j'avais besoin de "wrap_content" pour "layout_height". Lorsque je l'ai changé, l'image a été recadrée en bas et je n'ai pas pu faire défiler ou zoomer sur la zone recadrée. J'ai donc jeté un œil à la Source pour ImageView juste pour voir comment Android a implémenté "onMeasure" et a changé MikeOrtiz pour l'adapter.
@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);
}
Ici resolSize (int, int) est un "utilitaire pour réconcilier une taille souhaitée avec des contraintes imposées par un MeasureSpec, où:
Paramètres:
- size How big the view wants to be
- MeasureSpec Constraints imposed by the parent
Retour:
- The size this view should be."
Offrant donc essentiellement un comportement un peu plus similaire à la classe ImageView d'origine lorsque l'image est chargée. D'autres modifications pourraient être apportées pour prendre en charge une plus grande variété d'écrans qui modifient le rapport d'aspect. Mais pour l'instant, j'espère que cela vous aidera. Merci à MikeOrtiz pour son code original, excellent travail.