縦横比を維持しながら、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
のみがストレッチされます
それは、少なくとも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" />
Android:adjustViewBounds="true"
仕事をします!
これを使うMainImage.setScaleType(ImageView.ScaleType.FIT_XY);
または、単にAndroid:scaleType="fitXY"
in xml。
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つの見事な答え( これ および これ )を組み合わせて簡単な解決策にします。これにより、不必要な調査時間を節約できることを願っています。
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));
この動作が必要な場合は、通常、XMLで次のクラスを使用します。
もちろん、私は時々いくつかの要件に従ってそれを微調整します。しかし、ビューのコンテキストでJavaコードの代わりに、XMLでImageViewから別のクラスにクラスを変更する方が簡単だと思います。
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);
}
}
Android:scaleType="CENTER_INSIDE"
をお試しください
します:
<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>
あなたがしたいことをしませんか?