Як отримати ширину та висоту android.widget.ImageView?


272
╔══════════════════════════════════════════════╗   ^
 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, навіть у нього за замовчуванням висота та ширина


«Оскільки я не хочу вказувати значення за замовчуванням, тому що коли-небудь я міняю його висоту і ширину, я також повинен змінювати його в коді» - що можна змінити? зображення зображення або збережені зображення?
Педро Лурейро

ви не можете просто використовувати android:scaleType="centerInside"?
bigstones

2
@nightcracker: Це не ASCII.
Joey

7
@ Јοeu Коли я сказав "ASCII", я мав на увазі "мистецтво ASCII", яке охоплює більше мистецтва, ніж те, що складається лише з набору символів ASCII.
orlp

1
Це не відповідає безпосередньо на запитання, але якщо вам цікаво, чому getHeight () / getWidth () повертають 0, вони завжди повернуть 0, якщо ви будете викликати ці методи до того, як перегляд був "намальований", тобто якщо ви хочете
Викличте

Відповіді:


222

Моя відповідь на це питання може допомогти вам:

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 ().


8
дуже приємний братовий код і логічний +1 для цього. Ви також можете досягти цього, встановивши властивість ImageView android: prilagodViewBounds = "true" на true :)
AZ_

ей, але під час налагодження вказівник не переходить у параметр onPreDraw (). Чому це так?
Geetanjali

3
Я думаю, вам потрібно додати vto.removeOnPreDrawListener (це); лінія всередині onPreDraw ()
sagus_helgy

1
@ KK_07 дивіться редагування відповідно до коментаря Страждальника. Просто потрібно видалити слухача після того, як ви закінчите його.
Кевін Коппок

6
як ви присвоюєте значення finalHeight та finalWidth всередині внутрішнього класу, не роблячи їх остаточними?
Кріс

29

Я просто встановив цю властивість і тепер ОС Android піклується про кожну річ.

android: prilagodViewBounds = "вірно"

Використовуйте це у своєму layout.xml, де ви посадили ImageView: D


4
@jww Я дійсно не відповідаю негативним виборцям: p, спочатку прочитайте про getWidth та getMeasured в документації на Android. потім приходять і голосують люди.
AZ_

27

Я міг отримати ширину та висоту зображення за допомогою його малювання;

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

14

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

Як ви вирішите розмір, який потрібно надати зображенню? Ви не можете просто скористатися одним із варіантів масштабування, що вперше реалізований?


Я надав ImageView висоту та ширину за замовчуванням, але коли я намагаюся їх ввести у код, вона повертає мені 0. Я думаю, що я повинен спочатку надути ImageView. але як це зробити?
AZ_

Я звертаюся до цього у своїй відповіді. Прочитайте ще раз :) Я думаю, ваш погляд уже завищений. Ти це бачиш? якщо можете, то це завищено.
Педро Лурейро

13

Публікація в потоці інтерфейсу користувача працює для мене.

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();

            }
});

Дуже корисно!
Хаві Хіменес

Неправильно. Ширина та висота запиту від інтерфейсу користувача не гарантують, що ці значення готові. Інфляція переглядів просто трапилася у вашій вибірці, але це може бути інакше
rommex

6

ваш 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();

5

Я думаю, ви можете дозволити ОС Android подбати про це за вас. Встановіть тип масштабу на ImageView, fitXYа зображення, яке відображається, буде розміром відповідно до поточного розміру подання.

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

4

Найпростіший спосіб - отримати ширину та висоту ImageView методом діяльності onWindowFocusChanged

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

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

}

1
onWindowFocusChanged просто робота над API18 і більше, і це не може бути найкращим способом ... проте спасибі
Milad gh

1

Якщо ви створили кілька зображень динамічно, ніж спробуйте це:

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

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);
            }

// Це воно. Щасливе кодування.


-2

мій друг по цьому u не отримує висоту зображення, що зберігається в db., але ви отримуєте висоту перегляду.


2
Я знаю висоту та ширину зображення, але хочу знати висоту та ширину ImageView, щоб я міг її масштабувати відповідно. Сподіваюся, ви зрозумієте мою думку.
AZ_
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.