Existe-t-il un moyen courant d'afficher une grande image et de permettre à l'utilisateur de faire un zoom avant et arrière et de faire un panoramique sur l'image?
Jusqu'à présent, j'ai trouvé deux façons:
- écraser ImageView, cela semble un peu trop pour un problème aussi courant.
- en utilisant une vue Web mais avec moins de contrôle sur la mise en page globale, etc.
Réponses:
METTRE À JOUR
Je viens de donner à TouchImageView une nouvelle mise à jour. Il comprend désormais le zoom double pression et le lancer en plus du zoom panoramique et pincé. Le code ci-dessous est très daté. Vous pouvez consulter le projet github pour obtenir le dernier code.
USAGE
Placez TouchImageView.java dans votre projet. Il peut ensuite être utilisé de la même manière que ImageView. Exemple:
Si vous utilisez TouchImageView en xml, vous devez fournir le nom complet du package, car il s'agit d'une vue personnalisée. Exemple:
Remarque: J'ai supprimé ma réponse précédente, qui comprenait un code très ancien et qui relie maintenant directement le code le plus récent sur github.
ViewPager
Si vous souhaitez mettre TouchImageView dans un ViewPager, reportez - vous à cette réponse.
la source
TouchImageView(Context context, AttributeSet attrs)
et appelezsuper(context, attrs);
-le parce que lorsque vous gonflez la vue personnalisée, elle est construite avec deux paramètres, plutôt qu'un seul. Lorsque j'y arriverai, je corrigerai TouchImageView pour prendre en charge les trois constructeurs de vues et les dessinables.<com.example.TouchImageView android:id="@+id/img" />
. As-tu fais ça?J'ai adapté du code pour créer un TouchImageView qui prend en charge le multitouch (> 2.1). Il s'inspire du livre Hello, Android! (3e édition)
Il est contenu dans les 3 fichiers suivants TouchImageView.java WrapMotionEvent.java EclairMotionEvent.java
TouchImageView.java
WrapMotionEvent.java
EclairMotionEvent.java
la source
WrapMotionEvent
etEclairMotionEvent
... de toute façon, +1.J'ai utilisé une WebView et chargé l'image de la mémoire via
Le WebView gère tout le zoom et le défilement panoramique. Si vous utilisez wrap_content, la vue Web ne sera pas plus grande que l'image et aucune zone blanche n'est affichée. Le WebView est le meilleur ImageView;)
la source
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:
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.
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:
Retour:
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.
la source
Vous pouvez également essayer http://code.google.com/p/android-multitouch-controller/
La bibliothèque est vraiment géniale, bien qu'au départ un peu difficile à saisir.
la source
Je viens d'intégrer TouchImageView de Robert Foss: cela a parfaitement fonctionné dès la sortie de la boîte! Merci!
Je viens de modifier un peu le code pour pouvoir l'instancier à partir de mon layout.xml.
Ajoutez simplement deux constructeurs
et transformer l'ancien constructeur en une méthode init:
la source
@Robert Foss, @Mike Ortiz, merci beaucoup pour votre travail. J'ai fusionné votre travail et terminé les cours Robert pour Android> 2.0 avec du travail supplémentaire pour Mike.
À la suite de mon travail, je présente Android Touch Gallery, basé sur ViewPager et utilisé TouchImageView modifié. Les images se chargent par URL et vous pouvez les zoomer et les faire glisser. Vous pouvez le trouver ici https://github.com/Dreddik/AndroidTouchGallery
la source
Essayez d'utiliser
ZoomView
pour zoomer toute autre vue.http://code.google.com/p/android-zoom-view/ c'est facile, gratuit et amusant à utiliser!
la source
Ajout à la réponse de @ Mike. J'ai également eu besoin d'appuyer deux fois pour restaurer l'image aux dimensions d'origine lors de sa première visualisation. J'ai donc ajouté un tas de variables d'instance "orig ..." et ajouté SimpleOnGestureListener qui a fait l'affaire.
la source
Ceci est un ajout très tardif à ce fil, mais j'ai travaillé sur une vue d'image qui prend en charge le zoom et le panoramique et possède quelques fonctionnalités que je n'ai pas trouvées ailleurs. Cela a commencé comme un moyen d'afficher de très grandes images sans causer
OutOfMemoryError
s, par sous - échantillonnage de l'image lors de zoom arrière et tuiles chargement de plus haute résolution lors d'un zoom. Désormais , il permet d' utiliser uneViewPager
rotation manuellement ou à l' aide des informations EXIF (90 ° arrêts), remplacer les événements tactiles sélectionnés en utilisantOnClickListener
ou votre propreGestureDetector
ouOnTouchListener
, sous-classe pour ajouter des superpositions, effectuer un panoramique pendant le zoom et lancer l'élan.Il n'est pas destiné à remplacer une utilisation générale,
ImageView
il ne l'étend donc pas et ne prend pas en charge l'affichage d'images à partir de ressources, uniquement des actifs et des fichiers externes. Il nécessite SDK 10.La source est sur GitHub, et il y a un exemple qui illustre l'utilisation dans a
ViewPager
.https://github.com/davemorrissey/subsampling-scale-image-view
la source
Vous pouvez essayer d'utiliser les LayoutParams pour cela
ZoomIn = zoom (vrai); ZoomOut = zoom (faux);
la source
et le dossier dessinable doit avoir un fichier image bticn. fonctionne parfaitement :)
la source
Quelque chose comme ci-dessous le fera.
Pour voir le programme complet, voir ici: Programme pour agrandir l'image dans Android
la source