Как найти ширину/высоту ImageView?

Мой вопрос похож на на этот вопрос. Я использовал этот код, чтобы расширить ImageView до формы TouchImageView. В моем методе onCreate() я хочу вызвать

setImage(Bitmap bm, int displayWidth, int displayHeight)

но я не знаю, какую ширину или высоту использовать. Когда я вызываю getHeight(), он дает мне нуль.

Я попытался избежать 0, используя kcoppock ответ на ранее упомянутый вопрос, но был безуспешными. Слушатель onPreDraw() вызывается несколько раз в секунду, и я не могу понять, как его вызывать только один раз.

Ответ 1

Это хрупкий подход для чего-то подобного. Взгляды Android измеряются их родительским представлением с помощью метода onMeasure. Предоставляя начальный размер методу setImage для масштабирования (и особенно, если вы установите его на основе размера экрана), вы вызываете сложность всякий раз, когда хотите вложить этот вид в другие. Хорошим примером этого являются устройства с большим экраном, такие как планшеты.

Более идиоматический подход будет реализовывать метод setImage метода TouchImageView без параметров ширины/высоты. Вместо этого он откладывает установку шкалы и матриц до измерения и реализует onMeasure примерно так:

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    if (mNeedsInitialScale) { // Set by setImage when a new image is set
        // The measured width and height were set by super.onMeasure above
        setInitialScale(getMeasuredWidth(), getMeasuredHeight());
        mNeedsInitialScale = false;
    }
}

Где метод setInitialScale делает все, что делает связанный метод setImage после вызова super.setImageBitmap. setImage также следует установить для поля mNeedsInitialScale значение true.

Таким образом вам никогда не придется беспокоиться об использовании начального размера, он будет автоматически получен из представления во время нормального измерения всякий раз, когда будет установлено новое изображение.

Ответ 2

Размеры ImageViews равны 0, пока ваша активность не нарисует его на экране. Вы можете использовать Activity onFocusChanged, чтобы установить Bitmap и получить правильные размеры если вы просто ищете DisplayWidth и высоту, вы можете позвонить

Display d = getSystemService(WINDOW_SERVICE).getDefaultDisplay();

и спросите Дисплей о его размерах