En essayant d'obtenir la taille d'affichage d'une image dans un ImageView

J'essaie d'obtenir la taille réelle d'une image affichée dans une vue d'image. En fait, mon image est plus grande que l'écran et la visualisation de l'image redimensionne l'image pour la diriger. Je recherche cette nouvelle taille.

J'ai essayé de remplacer la méthode onDraw de l'ImageView dans une vue personnalisée, mais je n'obtiens pas la bonne hauteur et largeur …

  • Android Studio: Comment migrer IntelliJ Project vers Gradle?
  • Android ne peut pas accéder à localhost?
  • Comment utiliser wrap_content avec une largeur maximale?
  • Org.eclipse.swt.SWTException: "Widget is disposé" lors de l'ouverture d'AndroidManifest.xml
  • Comment ajouter des effets sonores sur Android?
  • Classe de porteur en classe d'adaptateur
  • public class LandImageView extends ImageView { public LandImageView( Context context ) { super( context ); } public LandImageView(Context context, AttributeSet attrs) { super(context, attrs); } public LandImageView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected void onDraw( Canvas canvas ) { super.onDraw( canvas ); int test = this.getWidth(); int test2 = this.getHeight(); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); } } 

    Avez-vous des indices?

  • La reconnaissance de face ouverte renvoie le même nom de DB pour les utilisateurs inconnus
  • Comment puis-je atteindre les meilleures performances en utilisant SQLite dans Android?
  • Android Studio 3.0 Beta 1: Impossible de résoudre: com.android.support:multidex:1.0.2
  • Support log4j dans Android
  • But du service Intent-Filter inside Manifest.xml
  • Comment changer les icônes de navigation de la barre d'outils et du débordement (appcompat v7)?
  • 11 Solutions collect form web for “En essayant d'obtenir la taille d'affichage d'une image dans un ImageView”

    Aucune des réponses ici ne répond actuellement à la question:

    À partir d'un Bitmap de n'importe quelle taille affichée par un ImageView , trouvez les dimensions réelles de l'image affichée par opposition aux dimensions du Bitmap fourni.

    À savoir:

    • À l'aide d' ImageView.getDrawable().getInstrinsicWidth() et getIntrinsicHeight() les dimensions d'origine.
    • Obtenir le Drawable travers Drawable ImageView.getDrawable() et le lancer dans un BitmapDrawable , puis utiliser BitmapDrawable.getBitmap().getWidth() et getHeight() renvoient également l'image d'origine et ses dimensions.

    La seule façon d'obtenir les dimensions réelles de l'image affichée est d'extraire et d'utiliser la Matrix transformation utilisée pour afficher l'image telle qu'elle apparaît. Cela doit être fait après l'étape de mesure et l'exemple ici montre qu'il a été appelé dans un Override de onMeasure() pour un onMeasure() personnalisé:

     public class SizeAwareImageView extends ImageView { public SizeAwareImageView(Context context) { super(context); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); // Get image matrix values and place them in an array float[] f = new float[9]; getImageMatrix().getValues(f); // Extract the scale values using the constants (if aspect ratio maintained, scaleX == scaleY) final float scaleX = f[Matrix.MSCALE_X]; final float scaleY = f[Matrix.MSCALE_Y]; // Get the drawable (could also get the bitmap behind the drawable and getWidth/getHeight) final Drawable d = getDrawable(); final int origW = d.getIntrinsicWidth(); final int origH = d.getIntrinsicHeight(); // Calculate the actual dimensions final int actW = Math.round(origW * scaleX); final int actH = Math.round(origH * scaleY); Log.e("DBG", "["+origW+","+origH+"] -> ["+actW+","+actH+"] & scales: x="+scaleX+" y="+scaleY); } } 

    Remarque: Pour obtenir la Matrix de transformation d'image du code en général (comme dans une Activity ), la fonction est ImageView.getImageMatrix() – par exemple myImageView.getImageMatrix()

    J'ai étendu la réponse de BT pour en produire une méthode statique et pour inclure les positions d'image gauche et supérieure dans ImageView:

     /** * Returns the bitmap position inside an imageView. * @param imageView source ImageView * @return 0: left, 1: top, 2: width, 3: height */ public static int[] getBitmapPositionInsideImageView(ImageView imageView) { int[] ret = new int[4]; if (imageView == null || imageView.getDrawable() == null) return ret; // Get image dimensions // Get image matrix values and place them in an array float[] f = new float[9]; imageView.getImageMatrix().getValues(f); // Extract the scale values using the constants (if aspect ratio maintained, scaleX == scaleY) final float scaleX = f[Matrix.MSCALE_X]; final float scaleY = f[Matrix.MSCALE_Y]; // Get the drawable (could also get the bitmap behind the drawable and getWidth/getHeight) final Drawable d = imageView.getDrawable(); final int origW = d.getIntrinsicWidth(); final int origH = d.getIntrinsicHeight(); // Calculate the actual dimensions final int actW = Math.round(origW * scaleX); final int actH = Math.round(origH * scaleY); ret[2] = actW; ret[3] = actH; // Get image position // We assume that the image is centered into ImageView int imgViewW = imageView.getWidth(); int imgViewH = imageView.getHeight(); int top = (int) (imgViewH - actH)/2; int left = (int) (imgViewW - actW)/2; ret[0] = left; ret[1] = top; return ret; } 

    J'ai constaté que la suggestion de WarrenFaith d'utiliser setAdjustViewBounds fonctionnait, mais je devais changer le layout_width / layout_height de ImageView sur 'wrap_content' (avec 'match_parent', setAdjustViewBounds n'a rien). Pour obtenir le comportement hauteur / largeur / gravité que je voulais, j'ai dû envelopper ImageView dans FrameLayout:

     <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" > <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:scaleType="fitCenter" android:adjustViewBounds="true" /> </FrameLayout> 

    Après cela, les dimensions d'ImageView (telles que retournées par getWidth () et getHeight ()) correspondent à la taille d'affichage de l'image.

    essayer

     ImageView.getDrawable().getIntrinsicHeight() ImageView.getDrawable().getIntrinsicWidth() 

    Je viens de passer, mais j'espère que cela me permet d'aller sous l'hypothèse que vous parlez de bitmaps dans votre image.

    Ce que vous voulez comprendre, c'est la différence entre

    bmpBack.getWidth() -> cela vous donne la taille de votre bitmap et bmpBack.getScaledWidth(canvas) ; -> cela vous donnera la taille du bitmap tel qu'indiqué sur l'écran.

    Je n'ai jamais utilisé ImageView parce que l'affichage relatif me rendait fou, alors à la fin, j'ai simplement remplacé onDraw et j'ai fait ma toile de manière très similaire à opengl.

    Je pense que c'est votre problème

    à votre santé

    Jason

    Essayez d'annuler onMeasure(int widthMeasureSpec, int heightMeasureSpec) au lieu de onSizeChanged.

    Si je vous récupère correctement, vous avez besoin de votre dimension ImageView, afin d'étaler votre image en conséquence. Je l'ai fait avec une classe personnalisée, où onMeasure() appel onMeasure() pour obtenir la largeur et la hauteur.

     class LandImageView extends ImageView{ public LandImageView (Context context, AttributeSet attrs) { super (context, attrs); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); final int width = MeasureSpec.getSize(widthMeasureSpec); final int height = MeasureSpec.getSize(heightMeasureSpec); Log.v("", String.format("w %dh %d", width, height)); // width and height are the dimensions for your image // you should remember the values to scale your image later on this.setMeasuredDimension(width, height ); }} 

    Dans onMeasure, vous obtenez la largeur et la hauteur de votre image afin qu'elle corresponde à votre vue.

    Vous pouvez utiliser LandImageView dans votre mise en page comme ceci:

     <my.package.LandImageView ... > 
     public class images extends Activity { ImageView i1; LinearLayout l1; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); i1=(ImageView)findViewById(R.id.iv); l1 = new LinearLayout(this); ImageView i = new ImageView(this); ImageView i1 = new ImageView(this); i.setImageResource(R.drawable. imagename.........); l1.addView(i); l1.addView(i1); setContentView(l1); } } 

    Ajoutez d'abord les images dans votre dossier de ressources ……. et dans le fichier xml, créez une vue d'image ….

    Je cherchais une solution pour définir la dimension de la vue d'image sur l'image mise à l'échelle pour éviter l'espace vide en haut / bas ou gauche / droit (la dimension de la vue ne change pas pour correspondre à l'image mise à l'échelle).

    Ce que j'ai trouvé pour faire le tour était d'utiliser la méthode mImageView.setAdjustViewBounds(true); Ce qui entraîne la dimension de mise en page correcte. Je n'ai pas la dimension d'image mise à l'échelle, mais j'ai obtenu le résultat que je recherchais … juste si quelqu'un en avait besoin …

    Essayez de charger votre ressource en utilisant BitmapFactory.decodeResource (ressources res, int id, BitmapFactory.Options opts) avec la classe BitmapFactory.Options (). BitmapFactory.Options() a un drapeau appelé "inJustDecodeBounds" et ne donne que les dimensions de la ressource.

    J'espère que ça m'a aidé.

    Que diriez-vous de ImageView.getBackground () ou ImageView.getDrawable (), puis Drawable.getBounds ()?

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.