web-dev-qa-db-ja.com

縦横比を維持するためにImageViewで画像を拡大縮小する方法

Androidでは、ImageViewlayout_widthfill_parentに定義しました(これは電話の全幅を占めます)。

私がImageViewに入れた画像がlayout_widthよりも大きい場合、Androidはそれを拡大縮小します、そうでしょう?しかし、高さはどうですか? Androidが画像を拡大縮小しても、縦横比は維持されますか。

私が見つけたのは、AndroidがImageViewよりも大きい画像を拡大縮小するとき、ImageViewの上下に空白があることです。本当?もしそうなら、どうすればその空白を削除できますか?

473
michael
  1. はい。デフォルトでは、Androidは縦横比を維持しながら、ImageViewに合わせて画像を縮小します。ただし、Android:src="..."ではなくAndroid:background="..."を使用してImageViewに画像を設定していることを確認してください。 src=は縦横比を維持しながら画像を拡大縮小しますが、background=はImageViewのサイズにぴったり合うように画像を拡大縮小 および /歪ませます。 (ただし、背景とソースを同時に使用することもできます。これは、1つのImageViewを使用してメイン画像の周囲にフレームを表示する場合などに便利です。)

  2. また、ImageViewがそれ自身をサイズ変更された画像に合うようにサイズ変更するためにAndroid:adjustViewBoundsを見るべきです。たとえば、通常正方形のImageViewになる長方形の画像がある場合、adjustViewBounds = trueはImageViewも長方形になるようにサイズ変更します。これは他のビューがImageViewの周りにどのようにレイアウトされるかに影響します。

    それからSamuhが書いたように、あなたはそれがデフォルトで画像を拡大縮小する方法をAndroid:scaleTypeパラメータを使って変えることができます。ちなみに、これがどのように機能するのかを知る最も簡単な方法は、少し自分で実験することでした。 Eclipseでのプレビューは通常間違っているので、エミュレータ自体(または実際の携帯電話)のレイアウトを見てください。

742
Steve Haley

Android:adjustViewBounds を参照してください。

描画可能オブジェクトの縦横比を維持するためにImageViewの境界を調整する場合は、これをtrueに設定します。

268
Gratzi

この問題を抱えている他の人に。幅がfill_parent、高さがそれに比例するように調整したいImageView(またはその他のView)があります。

これら2つの属性をImageViewに追加します。

Android:adjustViewBounds="true"
Android:scaleType="centerCrop"

ImageViewの幅をfill_parentに、高さをwrap_contentに設定します。

また、画像をトリミングしたくない場合は、次の方法を試してください。

 Android:adjustViewBounds="true"
 Android:layout_centerInParent="true"
158
Kevin Parker

適切な縦横比を保ちながら拡大縮小する両方のImageViewが必要な場合は、これをXMLに追加します。

Android:adjustViewBounds="true"
Android:scaleType="fitCenter"

これをあなたのコードに追加してください:

// We need to adjust the height if the width of the bitmap is
// smaller than the view width, otherwise the image will be boxed.
final double viewWidthToBitmapWidthRatio = (double)image.getWidth() / (double)bitmap.getWidth();
image.getLayoutParams().height = (int) (bitmap.getHeight() * viewWidthToBitmapWidthRatio);

これがうまくいくまで少し時間がかかりましたが、これは画像が画面の幅よりも小さく、画面の幅よりも大きい場合と、画像をボックス化しない場合の両方でうまくいくように見えます。

53
Kevin

これは私のために働いた:

Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:maxWidth="39dip"
Android:scaleType="centerCrop"
Android:adjustViewBounds ="true"
11
Mike6679

以下のコード縦横比としてのスケール画像の処理:

Bitmap bitmapImage = BitmapFactory.decodeFile("Your path");
int nh = (int) ( bitmapImage.getHeight() * (512.0 / bitmapImage.getWidth()) );
Bitmap scaled = Bitmap.createScaledBitmap(bitmapImage, 512, nh, true);
your_imageview.setImageBitmap(scaled);
8
Mukesh Parmar

これで私の問題は解決しました

Android:adjustViewBounds="true"
Android:scaleType="fitXY"
7

ImageView.ScaleType を見て、サイズ変更がImageViewで行われる方法を制御および理解してください。画像のサイズを変更すると(縦横比を維持しながら)、画像の高さまたは幅がImageViewの寸法よりも小さくなる可能性があります。

7
Samuh

縦横比を維持するためにImageViewでこれらのプロパティを使います:

Android:adjustViewBounds="true"
Android:scaleType="fitXY"

<ImageView
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:adjustViewBounds="true"
    Android:scaleType="fitXY"
    />
5
Atif Mahmood

画面より小さい画像があります。それを最大に比例して拡大し、ビューの中央に配置するには、次のコードを使用する必要がありました。

<ImageView
    Android:id="@+id/my_image"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:layout_centerInParent="true"
    Android:adjustViewBounds="true"
    Android:layout_weight="1"
    Android:scaleType="fitCenter" />

ただし、相対的なレイアウトがあり、いくつかの要素がImageViewの上または下に設定されている場合、それらが画像によって重なる可能性が高いことに注意してください。

4
halxinate

適切な拡大縮小と切り抜きの使用なしで、画像が正確に画像ビューにフィットすることを望むあなたの誰のためにも

imageView.setScaleType(ScaleType.FIT_XY);

imageViewはImageViewを表すビューです。

3

あなたはスクリーンの幅を計算することができます。そして、あなたはビットマップを拡大縮小することができます。

 public static float getScreenWidth(Activity activity) {
        Display display = activity.getWindowManager().getDefaultDisplay();
        DisplayMetrics outMetrics = new DisplayMetrics();
        display.getMetrics(outMetrics);
        float pxWidth = outMetrics.widthPixels;
        return pxWidth;
    }

画面幅と拡大縮小画像の高さを画面幅で計算します。

float screenWidth=getScreenWidth(act)
  float newHeight = screenWidth;
  if (bitmap.getWidth() != 0 && bitmap.getHeight() != 0) {
     newHeight = (screenWidth * bitmap.getHeight()) / bitmap.getWidth();
  }

あなたはビットマップを拡大縮小することができます後。

Bitmap scaledBitmap=Bitmap.createScaledBitmap(bitmap, (int) screenWidth, (int) newHeight, true);
3
mustafasevgi

これをプログラムで行うときは、必ず正しい順序でセッターを呼び出してください。

imageView.setAdjustViewBounds(true)
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP)
3
lukas

あなたの画像が最大限のスペースを占めるようにしたいのなら、最良の選択肢は

Android:layout_weight="1"
Android:scaleType="fitCenter"
2
Mohsen Afshin

画質が低下した場合:

Android:adjustViewBounds="true"

の代わりに

Android:adjustViewBounds="true"
Android:scaleType="fitXY"
1
Sumit Singh

縦横比を維持しながら、コンテナの寸法に合わせてビットマップを拡大縮小するアルゴリズムがあります。私の解決策を見つけてください ここ

これが誰かの手助けになることを願っています!

1
Parth Kapoor

ImageViewにAndroid:layout_gravityを使ってみてください。

Android:layout_width="wrap_content"
Android:layout_height="0dp"
Android:layout_gravity="center_vertical|center_horizontal"
Android:layout_weight="1"

上記の例は私のために働いた。

1
ITisha

Javaコードは必要ありません。あなたがする必要があります:

<ImageView
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:adjustViewBounds="true"
Android:scaleType="centerCrop" />

幅と高さの一致する親にキーがあります

1
Romu Dizzy

あなたはまたあなたの画像のサイズを縮小する画像を拡大縮小することができます。それをダウンロードして使用できるライブラリがあります。 https://github.com/niraj124124/Images-Files-scale-and-compress.git

使用方法1)compress-v1.0をインポートします。あなたのプロジェクトへのjarファイル。 2)テスト用に以下のサンプルコードを追加します。 ResizeLimiter resize = ImageResizer.build(); resize.scale( "inputImagePath"、 "outputImagePath"、imageWidth、imageHeight);あなたの条件に従ってもっと多くの方法があります

0
Niraj

私はこれを使う:

<ImageView
Android:id="@+id/logo"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:layout_centerInParent="true"
Android:scaleType="centerInside"
Android:src="@drawable/logo" />
0
Flavio Capaccio

あなたのImageViewを渡して、あなたがそれを作ることができるスクリーンの高さと幅に基づいて

    public void setScaleImage(EventAssetValueListenerView view){
        // Get the ImageView and its bitmap
        Drawable drawing = view.getDrawable();
        Bitmap bitmap = ((BitmapDrawable)drawing).getBitmap();
        // Get current dimensions
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();

        float xScale = ((float) 4) / width;
        float yScale = ((float) 4) / height;
        float scale = (xScale <= yScale) ? xScale : yScale;

        Matrix matrix = new Matrix();
        matrix.postScale(scale, scale);

        Bitmap scaledBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);
        BitmapDrawable result = new BitmapDrawable(scaledBitmap);
        width = scaledBitmap.getWidth();
        height = scaledBitmap.getHeight();

        view.setImageDrawable(result);

        LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) view.getLayoutParams();
        params.width = width;
        params.height = height;
        view.setLayoutParams(params);
    }
0
user2100931

cardviewを丸めるためにimageviewを使用し、ヘッダーのために固定されたAndroid:layout_heightを使用する場合、これは私にとってGlideで画像をロードするのに役立ちました

    <?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
             xmlns:tools="http://schemas.Android.com/tools"
             Android:layout_width="match_parent"
             Android:layout_height="220dp"
             xmlns:card_view="http://schemas.Android.com/apk/res-auto"
             >

    <Android.support.v7.widget.CardView
            Android:id="@+id/card_view"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:layout_gravity="center|top"
            card_view:cardBackgroundColor="@color/colorPrimary"
            card_view:cardCornerRadius="10dp"
            card_view:cardElevation="10dp"
            card_view:cardPreventCornerOverlap="false"
            card_view:cardUseCompatPadding="true">

        <ImageView
                Android:adjustViewBounds="true"
                Android:maxHeight="220dp"
                Android:id="@+id/iv_full"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:scaleType="fitCenter"/>

    </Android.support.v7.widget.CardView>
</FrameLayout>
0
lvl4fi4

これは、ConstraintLayout内でどのように機能したかです。

<ImageView
    Android:id="@+id/myImg"
    Android:layout_width="300dp"
    Android:layout_height="300dp"
    Android:scaleType="fitCenter"
    Android:adjustViewBounds="true"/>

次に、コードで、ドロアブルを次のように設定します。

ImageView imgView = findViewById(R.id.myImg);
imgView.setImageDrawable(ResourcesCompat.getDrawable(getResources(), R.drawable.image_to_show, null));

これにより、アスペクト比に応じて画像がうまくフィットし、中央に配置されます。

0
Jeet