web-dev-qa-db-ja.com

画像を拡大して合わせる

縦横比を維持しながら、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のみがストレッチされます

17
Matt

それは、少なくとも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" />
23
Andy Res

Android:adjustViewBounds="true"仕事をします!

6
ViliusK

これを使うMainImage.setScaleType(ImageView.ScaleType.FIT_XY);

または、単にAndroid:scaleType="fitXY" in xml。

6
halo89
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" />
5
Pedro Lobito

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));
2
Oleksiy

この動作が必要な場合は、通常、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);
    }
}
2
Sherif elKhatib

Android:scaleType="CENTER_INSIDE"をお試しください

Androidのドキュメントはこちら

1
Dan Schnau

します:

<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
yarian