2012-09-13 11 views
12

Potrzebuję zmienić rozmiar obrazu, aby pasował do ekranu, zachował ten sam współczynnik proporcji. Następujące warunki przytrzymanie:Zmiana rozmiaru ImageView w celu dopasowania do proporcji obrazu

  • Obrazy są stałą szerokość (rozmiar od szerokości ekranu)
  • Obrazy są pobierane z Internetu, to znaczy wielkość można określić dopiero później
  • stosunek
  • obrazu dla każdego obrazu będzie różnią się; niektóre są wysokie, niektóre są kwadratowe, niektóre są płaskie
  • ImageView za wysokość musi się zmienić, albo większy lub mniejszy w zależności od współczynnika kształtu
  • Excess wysokości jest przycięty, nie może mieć dużo pustej przestrzeni jak to jest domyślnie.

Na przykład mały obraz o wymiarach 50 x 50 na ekranie o szerokości 400 pikseli może przeskalować obraz do rozmiaru 400 x 400 pikseli. Obraz 800x200 będzie skalowany do rozmiaru 400 x 100.

Przyjrzałem się większości innych wątków, a wiele proponowanych rozwiązań, takich jak zwykłe zmienianie adjustViewBounds i scaleType, skaluje tylko obraz w dół i nie skaluje go.

Odpowiedz

9
ImageView mImageView; // This is the ImageView to change 

// Use this in onWindowFocusChanged so that the ImageView is fully loaded, or the dimensions will end up 0. 
public void onWindowFocusChanged(boolean hasFocus) 
{ 
    super.onWindowFocusChanged(hasFocus); 

    // Abstracting out the process where you get the image from the internet 
    Bitmap loadedImage = getImageFromInternet (url); 

    // Gets the width you want it to be 
    intendedWidth = mImageView.getWidth(); 

    // Gets the downloaded image dimensions 
    int originalWidth = loadedImage.getWidth(); 
    int originalHeight = loadedImage.getHeight(); 

    // Calculates the new dimensions 
    float scale = (float) intendedWidth/originalWidth; 
    int newHeight = (int) Math.round(originalHeight * scale); 

    // Resizes mImageView. Change "FrameLayout" to whatever layout mImageView is located in. 
    mImageView.setLayoutParams(new FrameLayout.LayoutParams(
      FrameLayout.LayoutParams.WRAP_CONTENT, 
      FrameLayout.LayoutParams.WRAP_CONTENT)); 
    mImageView.getLayoutParams().width = intendedWidth; 
    mImageView.getLayoutParams().height = newHeight; 
} 
24

Stworzyłem ją z pomocą odpowiedz Boba Lee w tym poście: Android: How to stretch an image to the screen width while maintaining aspect ratio?

package com.yourpackage.widgets; 

import android.content.Context; 
import android.util.AttributeSet; 
import android.widget.ImageView; 

public class AspectRatioImageView extends ImageView { 

    public AspectRatioImageView(Context context) { 
     super(context); 
    } 

    public AspectRatioImageView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public AspectRatioImageView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     int width = MeasureSpec.getSize(widthMeasureSpec); 
     int height = width * getDrawable().getIntrinsicHeight()/getDrawable().getIntrinsicWidth(); 
     setMeasuredDimension(width, height); 
    } 
} 

teraz, aby wykorzystać je w XML:

<com.yourpackage.widgets.AspectRatioImageView android:layout_centerHorizontal="true" 
    android:src="@drawable/yourdrawable" android:id="@+id/image" 
    android:layout_alignParentTop="true" android:layout_height="wrap_content" 
    android:layout_width="match_parent" android:adjustViewBounds="true" /> 

Miłej zabawy!

+4

+1, ładne i proste, tylko bym ją chronić przeciwko 'getIntrinsicWidth' będącemu 0 (zawiesi próbę dzielenia przez to) –

+0

adjustViewBounds powinno być również wykonane w AspectRatioImageView http://developer.android.com/reference/android/widget/ImageView.html#setAdjustViewBounds%28boolean%29 – Nepster

1

wolę odpowiedź Agarwal jest z pewnymi modyfikacjami, ponieważ jest resuable:

package com.yourpackage.widgets; 

import android.content.Context; 
import android.graphics.drawable.Drawable; 
import android.util.AttributeSet; 
import android.widget.ImageView; 

public class AspectRatioImageView extends ImageView { 

    public AspectRatioImageView(Context context) 
    {  
     super(context); 
     this.setScaleType(ScaleType.FIT_XY); 
    } 

    public AspectRatioImageView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     this.setScaleType(ScaleType.FIT_XY); 
    } 

    public AspectRatioImageView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     this.setScaleType(ScaleType.FIT_XY); 
    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) 
    { 
     Drawable d = getDrawable(); 

     if (d != null && d.getIntrinsicWidth() > 0) 
     { 
      int width = MeasureSpec.getSize(widthMeasureSpec); 
      if (width <= 0) 
       width = getLayoutParams().width; 

      int height = width * d.getIntrinsicHeight()/d.getIntrinsicWidth(); 
      setMeasuredDimension(width, height); 
     } 
     else 
      super.onMeasure(widthMeasureSpec, heightMeasureSpec);  
    } 
} 

teraz, aby używać go w XML:

<com.yourpackage.widgets.AspectRatioImageView 
android:src="@drawable/yourdrawable" 
android:layout_height="wrap_content" 
android:layout_width="match_parent"/> 
Powiązane problemy