web-dev-qa-db-ja.com

表示された画像のwrap_contentとしてのimageviewの高さ

ImageViewの幅は親によって設定され、高さはアスペクトに比例する必要があります。これは、次にImageViewのすぐ下に配置したいTextViewが表示されるためです。

を使用して正しく表示する画像を取得できます

Android:layout_width="fill_parent"
Android:layout_height="fill_parent"

ただし、ImageViewの高さは、表示される引き伸ばされた画像の高さよりもはるかに大きい親の高さになります。親の1つを垂直方向に小さくするという考えがありましたが、そこには、拡大された画像のサイズがまだわかりません。

小さな画像は横に埋められないため、以下は機能しません。

Android:layout_width="fill_parent"
Android:layout_height="wrap_content"

いじり

Android:layout_height="wrap_content"

それを取り巻くRelativeLayoutのために、すべては役に立ちません。 FrameLayoutとLinearLayoutも試しましたが失敗しました。

何か案は?

35
Scott Johansen

adjustViewBounds をtrueに設定する必要があります。

imageView.setAdjustViewBounds(true);
79
Kit

実際の画像サイズがImageViewの幅と高さ以上である場合は2つのケースがあり、実際の画像サイズがImageViewの幅と高さよりも小さい場合は、scaleTypeプロパティを使用してImageViewで画像を表示します。要件。

1.実際の画像サイズは、ImageViewに必要な幅と高さ以上です。

<ImageView
    Android:layout_width="match_parent" 
    Android:layout_height="wrap_content"
    Android:adjustViewBounds="true"
    Android:src="@drawable/ic_launcher"/>

2.実際の画像サイズは、ImageViewに必要な幅と高さよりも小さいです。

<ImageView
    Android:layout_width="match_parent" 
    Android:layout_height="wrap_content"
    Android:scaleType="fitXY"
    Android:src="@drawable/ic_launcher"/>
31
Haresh Chhelana

したがって、同じ問題が何度も発生し、既存のスタックオーバーフローの回答を確認したところ、この問題の解決策に関する実際の混乱を完全に説明できる回答はないことがわかりました。だからここに行きます:

API 17以降

imageView.setAdjustViewBounds(true);

OR(XML)

Android:adjustViewBounds="true"

問題を解決します。これは、画像リソースの実際のサイズに関係なく機能します。つまり、画像をレイアウト内の希望するサイズに拡大または縮小します。

API 17の下

API 17の下Android:adjustViewBounds="true"は、画像を縮小する場合にのみ機能し、拡大する場合には機能しません。つまり、画像ソースの実際の高さが、レイアウトで実現しようとしているサイズよりも小さい場合、wrap_contentは、その小さい高さを使用し、必要に応じて画像を「拡大」(拡大)しません。

したがって、API 17以下では、この動作を実現するためにカスタムImageViewを使用するしかありません。自分でカスタムImageViewを作成するか、すでにその仕事を行っているライブラリを使用することができます。

ライブラリを使用する

この問題を修正するライブラリはおそらく複数ありますが、そのうちの1つは次のとおりです。

compile 'com.inthecheesefactory.thecheeselibrary:adjustable-imageview:1.0.0'

これは次のように使用されます:

<com.inthecheesefactory.thecheeselibrary.widget.AdjustableImageView
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content"
                Android:adjustViewBounds="true"
                Android:src="@drawable/your_drawable"/>

カスタムビューの使用

既存のライブラリを使用する代わりに、カスタムビューを自分で作成することもできます。例:

import Android.content.Context;
import Android.graphics.drawable.Drawable;
import Android.util.AttributeSet;
import Android.view.ViewGroup;
import Android.view.ViewParent;
import Android.widget.ImageView;

public class ScalableImageView extends ImageView {

    boolean adjustViewBounds;

    public ScalableImageView(Context context) {
        super(context);
    }

    public ScalableImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ScalableImageView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public void setAdjustViewBounds(boolean adjustViewBounds) {
        this.adjustViewBounds = adjustViewBounds;
        super.setAdjustViewBounds(adjustViewBounds);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        Drawable drawable = getDrawable();
        if (drawable == null) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            return;
        }

        if (adjustViewBounds) {
            int drawableWidth = drawable.getIntrinsicWidth();
            int drawableHeight = drawable.getIntrinsicHeight();
            int heightSize = MeasureSpec.getSize(heightMeasureSpec);
            int widthSize = MeasureSpec.getSize(widthMeasureSpec);
            int heightMode = MeasureSpec.getMode(heightMeasureSpec);
            int widthMode = MeasureSpec.getMode(widthMeasureSpec);

            if (heightMode == MeasureSpec.EXACTLY && widthMode != MeasureSpec.EXACTLY) {
                int height = heightSize;
                int width = height * drawableWidth / drawableHeight;
                if (isInScrollingContainer())
                    setMeasuredDimension(width, height);
                else
                    setMeasuredDimension(Math.min(width, widthSize), Math.min(height, heightSize));
            } else if (widthMode == MeasureSpec.EXACTLY && heightMode != MeasureSpec.EXACTLY) {
                int width = widthSize;
                int height = width * drawableHeight / drawableWidth;
                if (isInScrollingContainer())
                    setMeasuredDimension(width, height);
                else
                    setMeasuredDimension(Math.min(width, widthSize), Math.min(height, heightSize));
            } else {
                super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            }
        } else {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        }
    }

    private boolean isInScrollingContainer() {
        ViewParent parent = getParent();
        while (parent != null && parent instanceof ViewGroup) {
            if (((ViewGroup) parent).shouldDelayChildPressedState()) {
                return true;
            }
            parent = parent.getParent();
        }
        return false;
    }
}

...次のように使用します(XML):

<com.YOUR_PACKE_NAME.ScalableImageView
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:adjustViewBounds="true"
    Android:src="@drawable/your_drawable" />
6

これは、2番目のImageViewを中央に配置し、最初のImageViewよりも小さくして、2番目のImageViewの下にTextViewを配置するための唯一の方法でした。

残念ながら、2番目のImageViewでは固定の「200dp」画像サイズを使用するため、異なるサイズのデバイスでは同じように見えません。

また、2番目のImageViewとTextViewの周りで試したレイアウトは、それらを移動またはサイズ変更するため、ViewFlipperも破棄されます。

<RelativeLayout 
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools" 
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent" >
    <ImageView
        Android:id="@+id/imageview1"
        Android:contentDescription="@string/desc"
        Android:layout_width="fill_parent"
        Android:layout_height="fill_parent"
        Android:src="@drawable/background" />
    <ImageView
        Android:id="@+id/imageview2"
        Android:layout_centerInParent="true"
        Android:contentDescription="@string/desc"
        Android:layout_height="200dp"
        Android:layout_width="200dp" 
        Android:adjustViewBounds="true"
        Android:src="@drawable/image2" />
    <TextView
        Android:id="@+id/textview"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_centerHorizontal="true"
        Android:layout_below="@id/imageview2"
        Android:paddingLeft="8dp"
        Android:paddingRight="8dp"
        Android:gravity="center"
        Android:textSize="26sp"
        Android:textColor="#333"
        Android:background="#fff"
        Android:text="this is the text under the image right here"
        />
</RelativeLayout>
0
Scott Johansen