拉伸图像以适应

Posted

技术标签:

【中文标题】拉伸图像以适应【英文标题】:Stretch Image to Fit 【发布时间】:2013-08-22 22:36:09 【问题描述】:

src 应将其宽度拉伸到match_parent,同时保持纵横比。当图像大于父图像时,它会正确缩小。但是当图像较小时,它不会按比例放大。 (插图显示了所需的行为)。

<RelativeLayout
    android:layout_
    android:layout_ >

    <ImageView
        android:id="@+id/banner"
        android:layout_
        android:layout_
        android:scaleType="fitCenter"
        android:adjustViewBounds="true"
        android:src="@drawable/foo"
        />

</RelativeLayout>

使用ScaleType.fitXY 仅拉伸width

【问题讨论】:

您是否尝试过使用刻度类型 fitEnd 或 fitStart?这对我解决类似的问题很有用。当我使用fitEnd时,我没有设置属性adjustViewBounds。 【参考方案1】:

使用这个MainImage.setScaleType(ImageView.ScaleType.FIT_XY);

或者您可以简单地在 xml 中添加 android:scaleType="fitXY"

【讨论】:

这比所有的 java.lang.谢谢! 谢谢你,android:scaleType="fitXY" 的工作就像一个魅力!【参考方案2】:

android:adjustViewBounds="true" 完成这项工作!

【讨论】:

确实如此。但是,不适用于 JellyBean 4.1.2【参考方案3】:

将两个出色的答案(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】:
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_
    android:layout_
    android:scaleType="centerInside"
    android:src="@drawable/image" />

【讨论】:

【参考方案5】:

当我想要这种行为时,我通常在 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);
    

【讨论】:

【参考方案6】:

我认为这是不可能的,至少对于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_
        android:layout_ />

【讨论】:

谢谢,成功了。我有一种感觉,解决方案将在 xml 之外 @Andy,您的代码是在什么上下文中编写的?我在 Context 或 Activity 中找不到 getScreenWidth()。 @YekhezkelYovel,您应该自己创建该方法。它的实现超出了答案的范围。 我现在明白了。我只是把评论放在那里,以表明你正在留下一些未完成的事情,但这没什么大不了的。【参考方案7】:

做:

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

没有做你想做的事?

【讨论】:

这会拉伸宽度,但不会拉伸高度。效果与fitXY 尝试让 layout_height = "match_parent" 这会让我的 ImageView 占据整个屏幕【参考方案8】:

试试android:scaleType="CENTER_INSIDE"

Android docs here

【讨论】:

不走运。这使得视图足够大以垂直放置图像,并在两侧留出空间

以上是关于拉伸图像以适应的主要内容,如果未能解决你的问题,请参考以下文章

拉伸图像以适应整个容器宽度引导程序

如何使用 CSS 拉伸图像以适应屏幕并保持纵横比?

android:在imageview中拉伸图像以适应屏幕

PySide2,如何拉伸 QTableWidget 以适应窗口宽度?

自动位图拉伸以适应 ImageView

缩小以适应 div 和段落,基于图像?