En Réponse à Janusz question d'origine, il y a plusieurs façons de faire cela tous qui varient dans leur niveau de difficulté et ont été indiqués ci-dessous. À l'aide d'un affichage web est bon, mais il est très limité en termes de look et de contrôlabilité. Si vous dessinez une image à partir d'un canevas, le plus polyvalent des solutions qui ont été proposées semble être MikeOrtiz, Robert des logiciels libres et/ou Jacob Nordfalk suggéré. Il est un excellent exemple d'intégration de l'android-multitouch-contrôleur par PaulBourke, et est idéal pour avoir le support multi-touch et alltypes des vues personnalisées.
Personnellement, si vous êtes tout simplement en dessinant une toile à une image bitmap, puis de l'afficher à l'intérieur et à l'ImageView et que vous voulez être en mesure d'effectuer un zoom avant et se déplacer à l'aide de multi-touch, je trouve MikeOrtiz la solution la plus simple. Cependant, pour ma part le code de l' Git qu'il a fourni semble ne fonctionnent que lorsque son TouchImageView personnalisé ImageView de classe est le seul enfant ou de fournir la mise en page params:
android:layout_height="match_parent"
android:layout_height="match_parent"
Malheureusement, à cause de ma conception de mise en page, j'avais besoin de "wrap_content" pour "layout_height". Quand je l'ai changé à ce que l'image a été rognée en bas et je ne pouvais pas faire défiler ou de zoom de la zone isolée.
Alors j'ai pris un coup d'oeil à la Source pour ImageView juste pour voir comment Android mis en œuvre "onMeasure" et changé MikeOrtiz de la fonction.
@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 resolveSize(int,int) est un "Utilitaire de concilier une taille souhaitée avec les contraintes imposées par un MeasureSpec, où :
Paramètres:
- size How big the view wants to be
- MeasureSpec Constraints imposed by the parent
Retourne:
- The size this view should be."
Donc, essentiellement, offrant un comportement un peu plus semblable à l'original ImageView classe lorsque l'image est chargée. D'autres changements pourraient être apportés à l'appui d'une plus grande variété d'écrans qui modifient l'aspect ratio. Mais pour l'instant, j'Espère que cette aide. Grâce à MikeOrtiz pour son code d'origine, excellent travail.