Android рассчитывает растровое изображение inSampleSize для другого целевого размера - PullRequest
0 голосов
/ 07 апреля 2011

Сначала у меня есть пользовательский компонент, который показывает фотографии из Интернета.Это простой макет и включает в себя круговой индикатор выполнения и ImageView.В состоянии по умолчанию индикатор выполнения виден и отображается во время загрузки изображения, а когда он закончится, я скрываю индикатор выполнения и показываю изображение в ImageView.Он работает очень хорошо, но в эмуляторе и в HTC Hero я получил java.lang.OutOfMemoryError: размер растрового изображения превышает бюджет виртуальной машины ошибка.Я нашел решение здесь .Но моя проблема в том, что TARGET_WIDTH и TARGET_HEIGHT не исправить, иногда 60x90, иногда fill_parent x fill_parent, и я не могу вычислить эти значения в функции декодирования.Например, я добавил свое представление в xml с layout_width = "fill_parent" и использую в Activity

super.onCreate(savedInstanceState);
setContentView(R.layout.main);

ImageLoader picture = (ImageLoader) findViewById(R.id.picture);
picture.load("http://winportal.net/images/galleries/wallpapers/Earth.jpg");

, а в методе загрузки я вызываю функцию декодирования из решения и пытаюсь вычислить размеры:

...
this.onMeasure(0, 0);
Log.d("Log", "Layout width: " + this.getMeasuredWidth());

TARGET_WIDTH =  this.getMeasuredWidth();
...

и результат: " Ширина макета: 24 "

Я не понимаю, почему получил 24 bacause это ширина индикатора выполнения, но макет - которыйвключить его - это ширина fill_parent.Я попытался переопределить метод onMeasure, но получил 0.

@Override
protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);

    int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
    int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
    this.setMeasuredDimension(parentWidth, parentHeight);
} 

Я попытался переопределить onSizeChanged тоже.Он дает хорошие значения, но запускается позже, после декодирования: (

Как рассчитать размер макета?

1 Ответ

0 голосов
/ 07 апреля 2011

Когда вы вызываете "this.onMeasure (0, 0);" Вы заставляете представление выполнять измерения по следующим правилам - НЕУТОЧНО . Ваше представление имеет следующее состояние: ProgressBar виден, ImageView скрыт, поэтому результат будет 24.

В начале попробуйте использовать FrameLayout с ProgressBar и ImageView. В этом сценарии вам не нужно заботиться об измерениях. Просто убедитесь, что изображение не слишком большое (в случае OutOfMemory). Вы можете загрузить файл изображения во временный файл, затем проверить размер с помощью this , рассчитать соответствующий размер выборки и выполнить декодирование, установить растровое изображение для ImageView, установить масштаб type для ImageView.

...