Как получить ширину и высоту файла android.widget.ImageView?

╔══════════════════════════════════════════════╗   ^
║ ImageView    ╔══════════════╗                ║   |
║              ║              ║                ║   |
║              ║ Actual image ║                ║   |
║              ║              ║                ║   |60px height of ImageView
║              ║              ║                ║   |
║              ║              ║                ║   |
║              ╚══════════════╝                ║   |
╚══════════════════════════════════════════════╝   
<------------------------------------------------>
                   90px width of ImageView

У меня есть изображение с некоторой высотой и шириной по умолчанию, изображения хранятся в db, и я хочу масштабировать изображение в соответствии с шириной высоты изображения. Поскольку я не хочу, чтобы он дал значения по умолчанию, потому что когда я меняю его высоту и ширину, я также должен изменить его в коде.

Я пытаюсь получить высоту и ширину ImageView, но 0 возвращается мне в обоих случаях.

int height = ((ImageView) v.findViewById(R.id.img_ItemView)).getHeight();

это возвращает мне 0, даже если он имеет высоту и ширину по умолчанию

Ответ 1

Мой ответ на этот вопрос может помочь вам:

int finalHeight, finalWidth;
final ImageView iv = (ImageView)findViewById(R.id.scaled_image);
final TextView tv = (TextView)findViewById(R.id.size_label);
ViewTreeObserver vto = iv.getViewTreeObserver();
vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
    public boolean onPreDraw() {
        iv.getViewTreeObserver().removeOnPreDrawListener(this);
        finalHeight = iv.getMeasuredHeight();
        finalWidth = iv.getMeasuredWidth();
        tv.setText("Height: " + finalHeight + " Width: " + finalWidth);
        return true;
    }
});

Затем вы можете добавить свою работу по масштабированию изображения из метода onPreDraw().

Ответ 2

Я просто установил это свойство, и теперь ОС Android заботится обо всех вещах.

Android: adjustViewBounds = "истинный"

Используйте это в вашем layout.xml, где вы установили ImageView: D

Ответ 3

Я мог бы получить ширину и высоту изображения по его возможности:

int width = imgView.getDrawable().getIntrinsicWidth();
int height = imgView.getDrawable().getIntrinsicHeight();

Ответ 4

Причина, по которой параметры ImageView равны 0, состоит в том, что когда вы запрашиваете их, представление все еще не выполнило макет и меры. Вы только сказали, как он будет "вести себя" в макете, но он все еще не рассчитал, где поставить каждое представление.

Как вы определяете размер, который нужно предоставить для просмотра изображения? Не можете ли вы просто использовать один из вариантов масштабирования, изначально реализованных?

Ответ 5

Сообщение для потока пользовательского интерфейса работает для меня.

final ImageView iv = (ImageView)findViewById(R.id.scaled_image);

iv.post(new Runnable() {
            @Override
            public void run() {
                int width = iv.getMeasuredWidth();
                int height = iv.getMeasuredHeight();

            }
});

Ответ 6

Я думаю, вы можете позволить ОС Android позаботиться об этом для вас. Установите тип шкалы в ImageView на fitXY, и отображаемое изображение будет иметь размер, соответствующий текущему размеру представления.

<ImageView 
    android:layout_width="90px" 
    android:layout_height="60px"
    android:scaleType="fitXY" />

Ответ 7

Самый простой способ - получить ширину и высоту ImageView в методе onWindowFocusChanged.

 @Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);

    height = mImageView.getHeight();
    width = mImageView.getWidth();

}

Ответ 8

ваш XML файл:

 <ImageView android:id="@+id/imageView"
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:src="@drawable/image"
               android:scaleType="fitXY"
               android:adjustViewBounds="true"/>

ваш java файл:

ImageView imageView = (ImageView)findViewById(R.id.imageView);
     int width = imageView.getDrawable().getIntrinsicWidth();
     int   height = imageView.getDrawable().getIntrinsicHeight();

Ответ 9

Если вы создали динамически несколько изображений, чем попробуйте это:

// инициализировать массив изображений

private ImageView myImages[] = new ImageView[your_array_length];

// создать программно и добавить в родительский вид

 for (int i = 0; i < your_array_length; i++) {
                myImages[i] = new ImageView(this);
                myImages[i].setId(i + 1);
                myImages[i].setBackgroundResource(your_array[i]);
                RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
                        frontWidth[i], frontHeight[i]);
                ((MarginLayoutParams) params).setMargins(frontX_axis[i],
                        frontY_axis[i], 0, 0);
                myImages[i].setAdjustViewBounds(true);
                myImages[i].setLayoutParams(params);

                if (getIntent() != null && i != your_array,length) {
                    final int j = i;
                    myImages[j].getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
                        public boolean onPreDraw() {
                            myImages[j].getViewTreeObserver().removeOnPreDrawListener(this);
                    finalHeight = myImages[j].getMeasuredHeight();
                        finalWidth = myImages[j].getMeasuredWidth();
                    your_textview.setText("Height: " + finalHeight + " Width: " + finalWidth);
                            return true;
                        }
                    });
                }
                your_parent_layout.addView(myImages[i], params);
            }

//Что это. Счастливое кодирование.

Ответ 10

Это не дает прямого ответа на вопрос, но если вам интересно, почему getHeight()/getWidth() возвращают 0, они всегда будут возвращать 0, если вы вызываете эти методы до того, как представление было "нарисовано", т.е. если вы вызовите эти методы в onCreate(), он вернет 0

Ответ 11

мой друг с этим u не получает высоту изображения, хранящегося в db.but, вы получаете высоту представления. Для получения высоты изображения u вам нужно создать растровое изображение из db, s image.and, чем вы можете получить высоту и ширину ImageView