1

Тема: Приховання елементів, котрі вийшли за екран

Прів.
Є контейнер в котрому збираються елементи при їх створенні. Це контейнер розширються вгору, по мірі поступання нових елементів.
Ми можемо скролити цей контейнер, аби почати ті елементи, що вийшли за межі екрану.
Необхідно приховувати ті елементи, котрі вийшли за межі екрану, але якщо ми скролимо, то елементи, котрі знову попадають на екран, повинні показуватись.

Зараз в мене є наступний алгоритм:

- при створенні елементу додаємо його в список
- під час скролення перебираємо кожен елемент списку і перевіряємо його на наявність в області екрану
- задля оптимізації ставимо заборону на перевірку елементів частіше ніж в 1/4 секунди

Проблема в том, що чим більше елементів, тим більше операції необхідно робити, при цьому, якщо ми скролимо без зупинки, то в секунду отримуємо

4*кількість елементів

перевірок, а сама перевірка містить перетворення координат з одної системи в іншу, і порівняння одних координат з іншими.
При цьому, якщо ми дивимось на низ списку і починаємо скролити, то перевірка починається з першого елементу, котрий далеко вгорі, і тому ми можемо побачити прогалини в елементах зверху екрану, тому що ми вже проскрорили до верху, але до цих елементів ще не дійшла черга.
Ну ви зрозуміли?

ось вам картинка, аби зрозуміліше було.
білий прямокутник - екран
зелений - контейнер
червоні прямокутники - елементи

http://puu.sh/r6q9R/449193c417.png

Які є варіанти оптимізувати це?
p.s. всі елементи різної висоти

All you want is a dingle,
What you envy's a schwang,
A thing through which you can tinkle,
Or play with, or simply let hang...

2

Re: Приховання елементів, котрі вийшли за екран

Вам рівняння скласти для нижнього і верхнього контейнерів на екрані чи що?

Подякували: FakiNyan1

3 Востаннє редагувалося FakiNyan (10.09.2016 20:36:32)

Re: Приховання елементів, котрі вийшли за екран

koala написав:

Вам рівняння скласти для нижнього і верхнього контейнерів на екрані чи що?

типу того, пане математик

All you want is a dingle,
What you envy's a schwang,
A thing through which you can tinkle,
Or play with, or simply let hang...

4

Re: Приховання елементів, котрі вийшли за екран

А в яких координатах все задано? Елементи однакової висоти?

5

Re: Приховання елементів, котрі вийшли за екран

та я ж в p.s. написав, шо різної.
Координати можна приводити з однією в іншу систему, так шо обирайте будь-яку.

І коли список піднятий в гору таким чином, що його нижній край видно на екрані, то воно повертає значення 1, а коли ми бачимо верхній край, то це 0
тобто якби елементи були однакової висоти, то вже можна було б розрахувати, що ми бачимо на екрані, а так, як вони різні, то фіг знає, хіба шо брати якесь середнє значення і обробляти відразу по 2-4 елементи знизу та зверху

All you want is a dingle,
What you envy's a schwang,
A thing through which you can tinkle,
Or play with, or simply let hang...

6

Re: Приховання елементів, котрі вийшли за екран

Я, власне, погано розумію, яким чином обчислення хай би і сотні перетворень координат хоч якось затримувало вивід, але якщо вже це вас хвилює - то зберігайте масив координат в тій системі, в якій воно буде виводитися, і обчислюйте положення у цьому масиві методом дихотомії. Складність O(log(N)). При зміні списку доведеться переобчислювати масив, але нічого складного не бачу.

7

Re: Приховання елементів, котрі вийшли за екран

хм, я зрозумів, чому воно затримувало вивід.

Справа в тому, що обрахунок цього всього зпрацьовує тоді, коли я рухаю скрол, але при цьому є обмеження, як я писав в першому пості. Обмеження каже, що обраховувати можна 1 раз в 0.25 секунди, тому коли я хтів переглянути верхні елементи і швидко крутанув той список, то якась частина верхніх повідомлень, що потрапили в поле зору, обрахувалась и показалась, а інша частина обрахувалась через 0.25 секунди

Але ж обраховувати то все для 100 елементів 10 раз в секунду якось гівняно виходе.

Що обчислювати методом дихотомії? Чи показувати, чи не показувати елемент?

All you want is a dingle,
What you envy's a schwang,
A thing through which you can tinkle,
Or play with, or simply let hang...

8

Re: Приховання елементів, котрі вийшли за екран

FakiNyan написав:

Що обчислювати методом дихотомії? Чи показувати, чи не показувати елемент?

Шукати потрібне місце в списку.

Подякували: leofun011

9

Re: Приховання елементів, котрі вийшли за екран

гаразд, одже, в залежності від напрямку скролування мені тре шукати або той елемент, котрий знаходиться прямо над верхнім краєм видимої області, або той, що прямо під нижнім краєм, ага?

All you want is a dingle,
What you envy's a schwang,
A thing through which you can tinkle,
Or play with, or simply let hang...

10

Re: Приховання елементів, котрі вийшли за екран

Скрол у вас вимірюється, до речі, в елементах чи в пікселях? Тобто якщо я один раз покрутив мишку - список зсунеться на 30px чи на 1 елемент, незалежно від його розміру?

11

Re: Приховання елементів, котрі вийшли за екран

koala написав:

Скрол у вас вимірюється, до речі, в елементах чи в пікселях? Тобто якщо я один раз покрутив мишку - список зсунеться на 30px чи на 1 елемент, незалежно від його розміру?

пікселі

All you want is a dingle,
What you envy's a schwang,
A thing through which you can tinkle,
Or play with, or simply let hang...

12

Re: Приховання елементів, котрі вийшли за екран

Тоді у вас відбулася подія "користувач проскролив на X пікселів". Список (чи його віджет абощо) має збергіати верхню межу вікна виводу. Ми її підіймаємо на X і створюємо подію "треба перемалювати список" (Refresh/Repaint). Такі події краще фільтрувати - якщо їх кілька в черзі, то можна відкласти всі разом на потім.
Тепер - про обробник Refresh. Знаходимо половинним діленням в списку, на якому саме елементі ця верхня межа знаходиться. Віднімаємо висоту екрану, знаходимо, який саме елемент внизу екрану (якщо елементи високі, то це можна робити прямим пошуком від верхнього). Готово - елементи знайдені.

Подякували: FakiNyan1

13

Re: Приховання елементів, котрі вийшли за екран

тут така срака, що іноді знизу додається дуже високий елемент, і аж декілька елементів вилазять за верхній край екрану. Я знаходжу той, котрий прямо точно за верхньою межою, але над ним є ще один елемент.
Подумав - буду брати той елемент, котрий знаходиться над межею на якійсь середній дистанції (поділив висоту екрану на 4), але ж половинчатий метод скаче туди-сюди, і він потрапляє відразу на елемент, що знаходиться над межею і є найближчим до межі, тобто елемент вище ігнорується

All you want is a dingle,
What you envy's a schwang,
A thing through which you can tinkle,
Or play with, or simply let hang...