web-dev-qa-db-ja.com

ImageViewは親の幅を塗りつぶしますOR高さですが、アスペクト比を維持します

正方形の画像があります(ただし、この問題は長方形の画像にも当てはまります)。画像をできるだけ大きく表示し、必要に応じて拡大して、縦横比を維持したまま両親を埋めたいと思います。画像はImageViewよりも小さいです。問題は、画像を引き伸ばして、ImageViewの高さと幅を「一致」させることができないことです。

これは私のXMLレイアウトファイルです:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
                Android:layout_width="fill_parent"
                Android:layout_height="wrap_content"
                Android:padding="10dp">

    <ImageView Android:id="@+id/image"
               Android:layout_width="fill_parent"
               Android:layout_height="fill_parent"
               Android:adjustViewBounds="true"
               Android:scaleType="fitCenter"
               Android:layout_marginTop="10dp"/>

    <TextView Android:id="@+id/name"
              Android:layout_below="@id/image"
              Android:layout_alignLeft="@id/image"
              Android:layout_marginTop="20dp"
              Android:layout_width="fill_parent"
              Android:layout_height="wrap_content"
              Android:textSize="18dp"/>

    <TextView Android:id="@+id/name2"
              Android:layout_below="@id/name"
              Android:layout_width="fill_parent"
              Android:layout_height="wrap_content"
              Android:textSize="14dp"/>


</RelativeLayout>

複数のscaleTypesを持つfill_parentwrap_contentの多くの組み合わせを使用しました:fitCenterfitStartfitEndcenterInside、それらはすべて正しいアスペクト比で画像を描画しますが、それらのどれも実際に画像を拡大せず、ImageView自体の結果、TextViewが画面から完全に押し下げられ、内部の空白スペースがImageView、スケーリングされていない画像、またはトリミングされた画像。

これに適した組み合わせはわかりません。

41

これら:

Android:layout_height="wrap_content"
Android:scaleType="fitStart"
Android:adjustViewBounds="true"

画像のサイズを変更し、新しい画像サイズに合わせて境界のサイズを変更する必要があります。そうでない場合は、デバイスで使用しているイメージとテストしているデバイスを投稿します。

101
FoamyGuy

このコードを使用してください:Android:scaleType="fitXY"

画像のスケーリングの詳細については、この記事で何が動いているのかをご覧ください here

概要:

  • center

画像をビューの中央に配置しますが、スケーリングは実行しません

enter image description here

  • centerCrop

画像の両方の寸法(幅と高さ)がビューの対応する寸法(マイナスパディング)以上になるように、画像を均一に拡大縮小します(画像の縦横比を維持します)。その後、画像はビューの中央に配置されます

enter image description here

  • centerInside

画像の両方の寸法(幅と高さ)がビューの対応する寸法(マイナスパディング)以下になるように、画像を均一に拡大縮小します(画像の縦横比を維持します)

enter image description here

  • fitCenter

enter image description here

  • fitEnd

enter image description here

  • fitStart

enter image description here

  • fitXY

enter image description here

  • matrix

描画時に画像行列を使用してスケーリングする

enter image description here

詳細 こちら 新しい記事

46
Context

このコードをwrap_contentとしてビューレイアウトパラメーターと共に使用します

Android:adjustViewBounds = "true"

これがうまくいくことを願っています。

14
akashPatra

このxmlコードは機能します!アプリの幅が常にウィンドウと同じであることを指定している場合、Android:adjustViewBounds="true"は、画像の配給量に応じて高さを設定します。

        <ImageView
        Android:adjustViewBounds="true"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:src="@drawable/screen"/>
11
Febin Mathew

Android:adjustViewBoundsが同じ問題を抱えていて、画像の上部にパディングがあります。幅と高さのmatch_parent値を持つ相対的なレイアウトには、次のものがありました。

   <RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
   Android:orientation="vertical" Android:layout_width="match_parent"
   Android:layout_height="match_parent"
   Android:background="@color/transparent">

   <ImageView
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:scaleType="fitStart"
    Android:adjustViewBounds="true" ...

相対レイアウトを、幅と高さのwrap_content値を持つ線形レイアウトに変更しましたが、今では大丈夫です:

    <LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:orientation="vertical"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
4
Laurie Trichet

プログラムで調整しようとしましたか? TextViewsの高さを計算し、これに基づいて画像の高さと幅を調整すると、本当にうまく機能すると思います。

private void adjustImageView()
{
    //Get the display dimensions
    DisplayMetrics metrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(metrics);

    //TextView name
    TextView name = (TextView) findViewById(R.id.name);
    name.setText("your name text goes here");
    name.measure(0, 0);

    //name TextView height
    int nameH = name.getMeasuredHeight();

    //TextView name2
    TextView name2 = (TextView) findViewById(R.id.name2);
    name2.setText("your name2 text goes here");
    name2.measure(0, 0);

    //name2 TextView height
    int name2H = name2.getMeasuredHeight();

    //Original image
    Bitmap imageOriginal = BitmapFactory.decodeResource(getResources(), R.drawable.image);

    //Width/Height ratio of your image
    float imageOriginalWidthHeightRatio = (float) imageOriginal.getWidth() / (float) imageOriginal.getHeight();

    //Calculate the new width and height of the image to display 
    int imageToShowHeight = metrics.heightPixels - nameH - name2H;
    int imageToShowWidth = (int) (imageOriginalWidthHeightRatio * imageToShowHeight);

    //Adjust the image width and height if bigger than screen
    if(imageToShowWidth > metrics.widthPixels)
    {
        imageToShowWidth = metrics.widthPixels;
        imageToShowHeight = (int) (imageToShowWidth / imageOriginalWidthHeightRatio);
    }

    //Create the new image to be shown using the new dimensions 
    Bitmap imageToShow = Bitmap.createScaledBitmap(imageOriginal, imageToShowWidth, imageToShowHeight, true);

    //Show the image in the ImageView
    ImageView image = (ImageView) findViewById(R.id.image);
    image.setImageBitmap(imageToShow);
}
3
slybloty

ImageviewでAndroid:layout_height="wrap_content"を設定します。幅が画面の幅に等しく、縦横比に応じて高さが比例して設定された画像を作成するには、次の手順を実行します。ここで、urlからimageviewに画像を読み込む方法について説明します。

Glide.with(context).load(url).asBitmap().into(new SimpleTarget<Bitmap>() {
                    @Override
                    public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {

                        // creating the image that maintain aspect ratio with width of image is set to screenwidth.
                        int width = imageView.getMeasuredWidth();
                        int diw = resource.getWidth();
                        if (diw > 0) {
                            int height = 0;
                            height = width * resource.getHeight() / diw;
                            resource = Bitmap.createScaledBitmap(resource, width, height, false);
                        }
                                              imageView.setImageBitmap(resource);
                    }
                });

お役に立てれば。

0
Fathima km