29

簡単なレイアウトは次のとおりです。

      <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <ImageView
                android:id="@+id/companyIcon"
                android:layout_width="wrap_content"
                android:layout_height="40dp" <!-- notice I've limited a height -->
                android:scaleType="fitStart"
                android:adjustViewBounds="true"
                android:layout_alignParentLeft="true" />

            <TextView
                android:id="@+id/companyName"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_toRightOf="@id/companyIcon"
                android:layout_marginLeft="3dp"
                android:layout_centerVertical="true"
                android:textStyle="bold"
                android:textColor="#20526d" />
        </RelativeLayout>

設定する画像の高さはsetImageBitmap()40 dp 以上です。このレイアウトを使用するImageViewTextView、 と の間に余分なスペースがありますが、それはどこから来たのですか? ここに画像の説明を入力

しかし、でラップした後、ImageViewこのFrameLayout不要な余分なスペースはありません:

<RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <FrameLayout
                android:id="@+id/image_container"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content">

                <ImageView
                    android:id="@+id/companyIcon"
                    android:layout_width="wrap_content"
                    android:layout_height="40dp"
                    android:scaleType="fitStart"
                    android:adjustViewBounds="true"
                    android:layout_alignParentLeft="true" />
            </FrameLayout>

            <TextView
                android:id="@+id/companyName"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_toRightOf="@id/image_container"
                android:layout_marginLeft="3dp"
                android:layout_centerVertical="true"
                android:textStyle="bold"
                android:textColor="#20526d" />
        </RelativeLayout>

そして結果:

ここに画像の説明を入力

意図したとおりにするために、なぜ私が入れなければならないのか説明できますImageViewFrameLayout? どうもありがとうございました。

4

6 に答える 6

30

setImageBitmap() で設定する画像の高さは 40 dp を超えています。このレイアウトを使用すると、ImageView と TextView の間に余分なスペースができます。どこから来たのですか?

android:layout_height="40dp"がであるためandroid:scaleType="fitStart"、画像は高さに合わせて縮小 (および左/開始) されるため、この「余分なスペース」は実際には画像の元の幅ですandroid:layout_width="wrap_content"。よりも大きい独自の画像でレイアウトを再作成しました40dp。を選択するとImageView、その境界が画像の元の幅まで伸びていることがわかります。

元のレイアウト

これをさらに証明するために、 を設定するandroid:scaleType="center"と、フィットは適用されず、ImageViewの元の幅が表示されます。

元のレイアウトはサイズに合わせて調整されていません

意図したとおりに ImageView を FrameLayout に配置する必要がある理由を説明できますか?

FrameLayoutを使用しているため、によって縮小された後android:layout_width="wrap_content"、正しい縮小幅が得られるようです。それ自体が を使用しているのは奇妙ですが、スケーリングされた幅ではなく、元の画像の幅を示しています。私の推測では、スケーリングが適用されるに s の高さと幅が設定されるため、元の画像の幅が取得されますが、スケーリングが適用された、親はその子のスケーリングされた幅を取得します。これは真実ではないかもしれませんが、私にはそのように見えます。ImageViewandroid:adjustViewBounds="true"ImageViewandroid:layout_width="wrap_content"ImageViewImageViewFrameLayoutImageView

ただし、 を使用することで、スケーリングされていない幅の問題を ( を使用せずにFrameLayout)解決できます。次に、画像が小さい場合よりも画像が小さくなるように設定できます。android:maxHeight="40dp"ImageViewandroid:layout_height="wrap_content"40dp

<ImageView
    android:id="@+id/companyIcon"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:adjustViewBounds="true"
    android:maxHeight="40dp"
    android:scaleType="fitStart" />

maxHeight を使用した元のレイアウト

于 2013-02-14T01:08:58.697 に答える
4

これはほとんどすべてのビューに適用されますが、回答は具体的に考慮して書かれていますImageView

高さと幅を設定するためのガイドライン

この 3 つのオプションから 1 つだけ選択してください。

  1. 高さと幅の両方WRAP_CONTENTを " "に設定します
  2. 高さと幅の両方FILL_PARENTを " "に設定します
  3. 高さと幅の両方FIXED SIZEを " " に設定します

    *それらの混合使用は避けてくださいWidth=WRAP_CONTENT and Height=FILL_PARENT

ImageView の SCALETYPE 設定ガイドライン

ScaleType は何をしますか?

設定した画像を ImageView にスケーリングします。ImageView をスケーリングしないため、fitStart に設定すると、画像がスケーリングされて右側に表示されますが、imageView は指定した高さと幅の点で同じままです。 .

WRAP_CONTENT高さと幅に使用しているかのように、 ScaleTypeを指定する必要はありません。これは、ImageView が自動的に画像と同じ大きさになるためです。

高さと幅に使用している場合と同様FILL_PARENTに、画像を中央、開始、終了、またはフル ビューで表示するオプションがあります。それに基づいて、ScaleType を選択できます。

FIXED_SIZEfpr の高さと幅を使用しているかのように、を選択する必要がありますscaletype=FITXY


ImageView に Image を設定するためのガイドライン

XML で画像を静的に設定しているかのように、手元に画像が 1 つあるため、レイアウト デザインに従って希望するサイズの画像を作成し、 WRAP_CONTENT に進むことができます。

どこかからダウンロードした後、実行時に画像を設定しているかのように、その時点で画像をダウンロードし、好みのサイズのビットマップを作成してから ImageView に設定します


あなたのケースに固有

画像がかなり引き伸ばされ、テキストが読めないことがわかります。これは、画像をダウンロードしてそのまま設定したが、高さと幅を小さくしたためです。むしろ、次のようにする必要がありました。

WRAP_CONTENTXML ファイルでImageView の高さと幅を設定する

                    <ImageView
                    android:id="@+id/companyIcon"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignParentLeft="true" />

たとえば、このコードを参照してください。

class LoadPics extends AsyncTask<Void, Bitmap, Bitmap> {
    String urlStr;
    ImageView iv;
    int width, height;

    public LoadPics(ImageView iv, String url, int width, int height) {
        this.iv = iv;
        this.urlStr = url;
        this.width = width;
        this.height = height;
    }

    @Override
    protected Bitmap doInBackground(Void... params) {
        try {
                InputStream in = null;
                try {
                    URL url = new URL(urlStr);
                    URLConnection urlConn = url.openConnection();
                    HttpURLConnection httpConn = (HttpURLConnection) urlConn;
                    httpConn.connect();
                    in = httpConn.getInputStream();
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }

                BitmapFactory.Options o = new BitmapFactory.Options();
                o.inJustDecodeBounds = true;

                int scale = 2;
                if (o.outHeight > width || o.outWidth > height) {
                    scale = 2 ^ (int) Math.ceil(Math.log(width
                            / (double) Math.max(o.outHeight, o.outWidth))
                            / Math.log(0.5));
                }

                if (scale <= 1 && o.outHeight > 150) {
                    scale = 5;
                }

                BitmapFactory.Options o2 = new BitmapFactory.Options();
                o2.inSampleSize = scale;
                Bitmap b1 = BitmapFactory.decodeStream(in, null, o2);
                b1 = Bitmap.createScaledBitmap(b1, width, height, true);
                loader.addToCache(urlStr, b1);
                publishProgress(b1);

        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onProgressUpdate(Bitmap... values) {
        super.onProgressUpdate(values);
        iv.setImageBitmap(values[0]);
    }
}

そして、引数を指定してこのメ​​ソッドを呼び出します。

new LoadPics(ivUser,imgURL,100,50).execute();
于 2013-02-14T06:55:25.957 に答える
1

android:scaleType="fitStart"これに置き換えてみてくださいandroid:scaleType="fitXY"


編集

画像ビューでは、imagView の幅をwrap-contentこれに設定する必要があります。これにより、画像のサイズが取得されます。幅をハードコーディングするとimageView's(幅を 40 dp にすることで行ったように)、他の Android モバイル デバイスでは見栄えがよくありません。

それでもやりたい場合は、解像度の低い画像を読み込んでみてください。この画像200X100の解像度が高い場合は、画像をロードしてみて100X50くださいImageView

于 2013-01-30T17:31:58.840 に答える
0

そうするとandroid:scaleType="FIT_END"、なしでFrameLayout、地下鉄の画像が「地下鉄」のテキストの近くに配置されますか?あなたがandroid:layout_alignParentLeft="true"そこにいるので、私は疑問に思います。ImageViewスケーリング前のの元のサイズは、。なしでレイアウトを破棄しているものだと思いFrameLayoutます。

おそらくそれほど重要ではありませんが、画像を希望どおりに拡大縮小およびサイズ変更するには、ある程度の処理が必要です。あなたがやりたいことが実行可能であれば、XMLに頼るのではなく、自分で画像のサイズを変更するだけです。複数のサイズに対応したい場合は、いくつかの異なるレイアウトを作成します。もちろん、これはあなたの目的にはやり過ぎかもしれません、私にはわかりません。

于 2013-01-30T22:16:42.933 に答える
0

スケールタイプをcenter_insideに設定してみてください。

于 2013-02-14T02:46:55.250 に答える
0

画像コンテナー レイアウトで一致する親を設定したため、最初の画像に余分なスペースが入りました。しかし、2番目に、画像コンテナであるFrameLayoutでラップコンテンツを使用しました。

これらのことを行うための私の提案リニアレイアウトインサイダー相対レイアウトを作成し、layout_weightプロパティを適用して、両方のビューで比率が同じになるようにします。

于 2013-02-12T06:03:43.380 に答える