src
应将其宽度拉伸至match_parent
,同时保持宽高比。当图像大于父图像时,它会正确缩小。但是当图像较小时,它不会向上扩展。 (插图显示了所需的行为)。
<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 :(得分:23)
我认为这是不可能的,至少不是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" />
答案 1 :(得分:6)
android:adjustViewBounds="true"
完成这项工作!
答案 2 :(得分: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" />
答案 3 :(得分:4)
使用此MainImage.setScaleType(ImageView.ScaleType.FIT_XY);
或者您只需在xml中添加android:scaleType="fitXY"
。
答案 4 :(得分: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 :(得分: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));
答案 6 :(得分:1)
尝试android:scaleType="CENTER_INSIDE"
答案 7 :(得分: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>
不做你想做的事?