Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Android Новый топик    Ответить
 Как определить размеры  [new]
Sp999
Member

Откуда: Пермь
Сообщений: 1667
Доброго времени суток всем!

Начал новое приложение, нагородил лайаут-файл для главного активити, внутри есть виджет ImageView.
Хотел в методе OnCreate активити определить его размеры для дальнейшего рисования с масштабированием, но не тут-то было - на этом этапе все размеры 0.
Обработку какого события надо прикрутить, чтобы это решить?

С уважением, Валера.
P.S.: При создании другого приложения, я в качестве основного содержимого главного активити устанавливал не лайаут-разметку, а класс, наследованный от View, вот там я мог заюзать событие onSizeChanged, а как сделать тут не могу придумать и в инете решения не нашел.
11 сен 18, 11:49    [21670732]     Ответить | Цитировать Сообщить модератору
 Re: Как определить размеры  [new]
alex55555
Member

Откуда:
Сообщений: 2129
Sp999
Хотел в методе OnCreate активити определить его размеры для дальнейшего рисования с масштабированием

Размер задаётся в LayoutParams. Под него же всё и масштабируется.

А вообще - мало того, что у гуглов получилась ужасная система, но и документирована она просто безобразно. Поэтому вам придётся ещё много чего копать и узнавать, просто для того, что бы полноценно контролировать поведение контролов на экране. Изучите пока LayoutParams, потом жизнь сама вам подскажет, что ещё изучать.
11 сен 18, 16:10    [21671160]     Ответить | Цитировать Сообщить модератору
 Re: Как определить размеры  [new]
A Serious Man
Member

Откуда: Москва
Сообщений: 22702
Sp999
Доброго времени суток всем!

Начал новое приложение, нагородил лайаут-файл для главного активити, внутри есть виджет ImageView.
Хотел в методе OnCreate активити определить его размеры для дальнейшего рисования с масштабированием, но не тут-то было - на этом этапе все размеры 0.
Обработку какого события надо прикрутить, чтобы это решить?

С уважением, Валера.
P.S.: При создании другого приложения, я в качестве основного содержимого главного активити устанавливал не лайаут-разметку, а класс, наследованный от View, вот там я мог заюзать событие onSizeChanged, а как сделать тут не могу придумать и в инете решения не нашел.

Размеры можешь определить так в oncreate

view = (ХХХХ) findViewById(R.id.ХХХХ);
view.post(new Runnable() {
   public void run() {
      int height = view.getHeight();
.....
   }
});
11 сен 18, 20:59    [21671496]     Ответить | Цитировать Сообщить модератору
 Re: Как определить размеры  [new]
Sp999
Member

Откуда: Пермь
Сообщений: 1667
A Serious Man, спасибо огромное!

А не мог бы ты еще объяснить, как оно работает?
Вроде, получается, что во время onCreate компонент уже есть, но размеров не имеет.
С помощью post ставим Runnable в очередь сообщений. Интересует, в какой именно момент оно достается из очереди и выполняется (на тот момент у компонента уже определены конкретные размеры).
12 сен 18, 09:17    [21671745]     Ответить | Цитировать Сообщить модератору
 Re: Как определить размеры  [new]
A Serious Man
Member

Откуда: Москва
Сообщений: 22702
Sp999
A Serious Man, спасибо огромное!

А не мог бы ты еще объяснить, как оно работает?
Вроде, получается, что во время onCreate компонент уже есть, но размеров не имеет.
С помощью post ставим Runnable в очередь сообщений. Интересует, в какой именно момент оно достается из очереди и выполняется (на тот момент у компонента уже определены конкретные размеры).


Когда oncreate завершится, будут сформированы вью, по окончанию запустится этот тред.
12 сен 18, 10:45    [21671823]     Ответить | Цитировать Сообщить модератору
 Re: Как определить размеры  [new]
chpasha
Member

Откуда:
Сообщений: 8182
A Serious Man
Размеры можешь определить так в oncreate

это какой-то жуткий костыль, здесь ты закладываешься на то, что потоковый код выполнится позже полной инициализации и отрисовки view, что мягко говоря спекуляций - однажды это может не сработать
если уж нам кровь-из-носу нужен размер View, в чем я сильно не уверен, то это можно сделать с помощью GlobalLayoutListener
ViewTreeObserver viewTreeObserver = view.getViewTreeObserver();
if (viewTreeObserver.isAlive()) {
  viewTreeObserver.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
      view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
      viewWidth = view.getWidth();
      viewHeight = view.getHeight();
    }
  });
}
12 сен 18, 12:19    [21671954]     Ответить | Цитировать Сообщить модератору
 Re: Как определить размеры  [new]
Sp999
Member

Откуда: Пермь
Сообщений: 1667
chpasha,

А откуда этот код запускать? и каков принцип его работы?

С уважением, Валера.
P.S.: Кстати, всех с профессиональным праздником!
13 сен 18, 07:08    [21673004]     Ответить | Цитировать Сообщить модератору
 Re: Как определить размеры  [new]
chpasha
Member

Откуда:
Сообщений: 8182
Sp999
А откуда этот код запускать?

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

Sp999
и каков принцип его работы?

если не вдаваться подробности, то принцип в том что это событие кидается тогда, когда View уже определился с размерами и расположился в содержащем его контейнере - в этот момент уже можно спрашивать его о размерах
13 сен 18, 12:23    [21673358]     Ответить | Цитировать Сообщить модератору
 Re: Как определить размеры  [new]
A Serious Man
Member

Откуда: Москва
Сообщений: 22702
chpasha
A Serious Man
Размеры можешь определить так в oncreate

это какой-то жуткий костыль, здесь ты закладываешься на то, что потоковый код выполнится позже полной инициализации и отрисовки view, что мягко говоря спекуляций - однажды это может не сработать
если уж нам кровь-из-носу нужен размер View, в чем я сильно не уверен, то это можно сделать с помощью GlobalLayoutListener
ViewTreeObserver viewTreeObserver = view.getViewTreeObserver();
if (viewTreeObserver.isAlive()) {
  viewTreeObserver.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
      view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
      viewWidth = view.getWidth();
      viewHeight = view.getHeight();
    }
  });
}

Мое работает, проверено и не один раз! У тебя какая-то перенахлобученность, такое не использовал.
14 сен 18, 10:04    [21674403]     Ответить | Цитировать Сообщить модератору
 Re: Как определить размеры  [new]
chpasha
Member

Откуда:
Сообщений: 8182
A Serious Man
Мое работает, проверено и не один раз

верю, но я объяснил почему это чисто случайный эффект - ты просто ставишь Runnable в очередь сообщений и надеешься, что оно сработает позже чем инициализация View

A Serious Man
У тебя какая-то перенахлобученность

не знал, что у нас тут соревнования. единственный известный мне надежный способ именно таков, увы ему не победить на конкурсе лаконичности
14 сен 18, 10:45    [21674457]     Ответить | Цитировать Сообщить модератору
Все форумы / Android Ответить