拉伸图像以适应
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
【讨论】:
不走运。这使得视图足够大以垂直放置图像,并在两侧留出空间以上是关于拉伸图像以适应的主要内容,如果未能解决你的问题,请参考以下文章