2013-08-20 3 views
13

src должен растягивать его ширину до match_parent, сохраняя соотношение сторон. Когда изображение больше родительского, оно масштабируется правильно. Но когда изображение меньше, оно не масштабируется. (иллюстрация показывает желаемое поведение).Растянуть изображение до размера

enter image description here

<RelativeLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <ImageView 
     android:id="@+id/banner" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:scaleType="fitCenter" 
     android:adjustViewBounds="true" 
     android:src="@drawable/foo" 
     /> 

</RelativeLayout> 


Использование ScaleType.fitXY растягивает width только

+0

Вы пробовали использовать тип шкалы fitEnd или fitStart? Это помогло мне решить подобную проблему. Когда я использовал fitEnd, я не установил свойство adjustViewBounds. – blackcj

ответ

22

Я считаю, что это невозможно, по крайней мере, не с параметрами, предоставляемыми атрибутом scaleType.
Ваш лучший вариант в этом случае - использовать centerCrop, но только центр изображения будет виден.

Однако, если вы не в порядке с этой опцией, вы можете масштабировать изображение программно, не теряя пропорции. Для этого вам необходимо рассчитать масштабный коэффициент, основанный на ширине экрана, а затем использовать этот масштабный коэффициент, чтобы узнать новую высоту изображения.

Как это:

ImageView imageView = (ImageView)findViewById(R.id.imageView); 
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.foo); 

int imageWidth = bitmap.getWidth(); 
int imageHeight = bitmap.getHeight(); 

int newWidth = getScreenWidth(); //this method should return the width of device screen. 
float scaleFactor = (float)newWidth/(float)imageWidth; 
int newHeight = (int)(imageHeight * scaleFactor); 

bitmap = Bitmap.createScaledBitmap(bitmap, newWidth, newHeight, true); 
imageView.setImageBitmap(bitmap); 

Кроме того, вам нужно настроить декларацию ImageView в файле макета:

<ImageView 
     android:id="@+id/imageView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 
+0

Спасибо, что сделал трюк. У меня было ощущение, что решение будет за пределами xml – Matt

+0

@ Энди, в каком контексте написан ваш код? Я не могу найти getScreenWidth() в Контексте или Деятельности. –

+0

@YekhezkelYovel, этот метод вы должны создать самостоятельно. Его реализация явилась следствием ответа. –

1

Попробуйте android:scaleType="CENTER_INSIDE"

Android docs here

+0

Не повезло. Это делает вид достаточно большим, чтобы соответствовать изображению вертикально, оставляя пространство с обеих сторон. – Matt

0

Делает:

<RelativeLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    <ImageView 
     android:id="@+id/banner" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:scaleType="centerCrop" 
     android:adjustViewBounds="true" 
     android:src="@drawable/foo" /> 
</RelativeLayout> 

Не делать то, что вы хотите?

+0

Это растягивает ширину, но не высоту. Тот же эффект, что и 'fitXY' – Matt

+0

Попробуйте сделать layout_height =" match_parent " – yarian

+0

Это заставит мой ImageView занять весь экран – Matt

2

я обычно использую следующий класс в XML, когда я хочу это поведение :

Конечно, я иногда настраиваю его в соответствии с некоторыми требованиями. Но мне легче изменить класс из ImageView в другой класс в XML вместо java-кода в контексте представления.

package shush.android.util; 

import android.annotation.SuppressLint; 
import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.drawable.BitmapDrawable; 
import android.util.AttributeSet; 
import android.widget.ImageView; 

/** 
* @author Sherif elKhatib 
* 
* ImageView Class that maintains the width of the view and changes height to keep the aspect ratio. 
*/ 
public class AspectImageView extends ImageView { 

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

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

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

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     if(getBackground() == null || getBackground().getIntrinsicHeight()==0 || getBackground().getIntrinsicWidth()==0) { 
      super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
      return; 
     } 
     int width = MeasureSpec.getSize(widthMeasureSpec); 
     int height = width * getBackground().getIntrinsicHeight()/getBackground().getIntrinsicWidth(); 
     setMeasuredDimension(width, height); 
    } 
    @SuppressLint("NewApi") 
    @SuppressWarnings("deprecation") 
    @Override 
    public void setImageBitmap(Bitmap bm) { 
     if(bm == null) 
      return; 
     BitmapDrawable bd = new BitmapDrawable(getContext().getResources(), bm); 
     if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) 
      setBackground(bd); 
     else 
      setBackgroundDrawable(bd); 
    } 
} 
5
setContentView(R.layout.activity_main); 

ImageView imageView = (ImageView)findViewById(R.id.imageView); 
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image); 

int imageWidth = bitmap.getWidth(); 
int imageHeight = bitmap.getHeight(); 

DisplayMetrics metrics = this.getResources().getDisplayMetrics(); 

int newWidth = metrics.widthPixels; 
float scaleFactor = (float)newWidth/(float)imageWidth; 
int newHeight = (int)(imageHeight * scaleFactor); 

bitmap = Bitmap.createScaledBitmap(bitmap, newWidth, newHeight, true); 
imageView.setImageBitmap(bitmap); 

РАСПОЛ

<ImageView 
    android:id="@+id/imageView" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:scaleType="centerInside" 
    android:src="@drawable/image" /> 
2

Объединение двух блестящих ответов (this one и this one) в быстрое решение. Надеюсь, это спасет кого-то ненужное время исследований!

private Bitmap getScaledBitmap(int resource) { 
    DisplayMetrics displaymetrics = new DisplayMetrics(); 
    getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); 
    int width = displaymetrics.widthPixels; 

    Bitmap bitmap = BitmapFactory.decodeResource(getResources(), resource); 

    float scaleFactor = (float) width/(float) bitmap.getWidth(); 
    int newHeight = (int) (bitmap.getHeight() * scaleFactor); 

    return Bitmap.createScaledBitmap(bitmap, width, newHeight, true); 
} 

Используйте это так:

imageView.setImageBitmap(getScaledBitmap(R.drawable.banner_home_2)); 
4

android:adjustViewBounds="true" делает работу!

+1

Это конечно. Но, не работая в JellyBean 4.1.2 – NarendraJi

2

использование этого MainImage.setScaleType(ImageView.ScaleType.FIT_XY);

ИЛИ вы можете просто добавить android:scaleType="fitXY" в XML.

+0

Это значительно проще, чем все java. Благодаря! – Tadhg

Смежные вопросы