Как мне найти ширину / высоту ImageView? - PullRequest
0 голосов
/ 06 июля 2011

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

setImage(Bitmap bm, int displayWidth, int displayHeight)

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

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

Ответы [ 2 ]

3 голосов
/ 06 июля 2011

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

В более идиоматическом подходе реализован метод TouchImageView setImage без параметров ширины / высоты. Вместо этого он отложил бы установку масштаба и матриц до измерения и реализовал 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.

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

1 голос
/ 06 июля 2011

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

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

и запросить у Display его размеры

...