1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/coku2333-FamilyTreeView

В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

FamilyTreeView

Важные улучшения, добавленная копия приложения "亲友+", с которой нет никакого отношения к предыдущей версии, можно сразу перейти ко второй части "копия亲友+ родословной" для чтения.

Демо построения родословной, основное использование пользовательского ViewGroup и canvas для рисования линий, на данный момент реализованы родители, супруги, братья и сестры, дети, дедушки и бабушки, прабабушки, внуки и зятья, всего пять поколений. Также добавлены события касания для перемещения, код может быть написан достаточно жестко и использоваться только для отображения родословной. Также добавлены элементы для усыновленных родителей, фактически это копия оригинального кода.

Первая часть: упрощенное родословие

Процесс выполнения

1. Сначала получаем Json из assets

assets

Часть Json Json

2. Преобразуем Json в список объектов

объекты

3. Сохраняем список объектов в базе данных

4. Запрашиваем базу данных для сборки связанных объектов

5. Передаем связанные объекты контролу для отображения родословной

Примеры

статический пример! статический пример## Описание подхода

1. Поток выполнения кода

1. 1. Сначала происходит инициализация данных, включая объекты членов семьи, кисти и т. д.
1. 2. Затем, на основе объектов членов семьи, измеряется ширина и высота ViewGroup, максимальная высота фиксирована и составляет пять поколений, ширина рассчитывается как максимальная ширина каждого поколения.
1. 3. Инициализация View, инициализация View каждого члена семьи. Затем вызывается invalidate() для обновления интерфейса.
1. 4. В методе onMeasure измеряется ширина и высота View каждого члена семьи.
1. 5. В методе onLayout устанавливаются конкретные позиции каждого члена семьи.
1. 6. В методе onDraw используется canvas для отрисовки линий, связывающих членов семьи.
1. 7. В методе onTouchEvent записывается обработка событий прикосновения для перемещения ViewGroup, а в onInterceptTouchEvent — для перехвата событий прикосновения членов семьи при перемещении.

2. Обработка позиционирования в методе onLayout

2. 1. Сначала устанавливается моя позиция View в центре всего размещения.
2. 2. Если есть супруг, он располагается справа от меня.
2. 3. Если есть братья и сестры, они располагаются слева от меня в порядке очередности.
2. 4. Если есть только отец или родители, они располагаются прямо над мной, если оба родителя присутствуют, отец располагается слева сверху, а мать — справа сверху.
2. 5.Принцип размещения дедушек и бабушек аналогичен родителям, но дедушки располагаются относительно отца, а бабушки — относительно матери.
    1. Сначала располагаются внуки и внучки, так как их позиции определяют позиции моих детей.
    1. После размещения внуки и внучки, их позиции используются для размещения детей.

3. Обработка рисования линий в методе onDraw

    1. Сначала рисуются линии между мной и супругом, используя canvas, Paint и Path.
    1. Затем рисуются линии между родителями и дедушками/бабушками, что не является сложным.
    1. Затем рисуются линии между братьями и сестрами, прямая линия от координаты X брата слева до координаты X моего View. Это ленивый способ рисования линий. ( ̄▽ ̄)")
    1. В конце рисуются линии между детьми и внуками, сначала рисуются линии между внуками и внучками с одного родителя, затем между внуками/внучками и детьми, затем между детьми, и в конце между мной и детьми.

Вторая часть: родословная, основанная на приложении "Близкие и друзья"

Описание: В этой части функционал создан в соответствии с приложением "Близкие и друзья". UI похож на "Близкие и друзья", но логика может отличаться, так как изначально планировалось разобрать "Близкие и друзья" для изучения их методов работы. К сожалению, "Близкие и друзья" используют 360加固, и у меня не было времени для дешифровки. Поэтому логику пришлось придумать самостоятельно.Отображаемые данные основаны на "Близкие и друзья", но включают также отображение супругов нижнего уровня. Вы можете настроить отображение супругов нижнего уровня, установив переменную mBottomNeedSpouse.## Поток выполнения

1. Получение JSON из assets

2. Преобразование JSON в список объектов

3. Сохранение списка объектов в базе данных

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

Объект

Примерный вид, здесь представлен только один пример, так как граф отношений очень большой. Для более точного представления рекомендуется запустить приложение и оценить его самостоятельно! Статический примерный вид## Описание подхода

1. Поток выполнения кода

1. 1. Сначала происходит инициализация данных, включая объекты членов семьи, кисти и т. д.
1. 2. Затем, на основе переданного ID члена семьи, выполняются серии запросов к базе данных, результаты которых размещаются в различных моделях или списках.
1. 3. Инициализация представления, включающая инициализацию представлений каждого члена семьи. При инициализации уже определены положения представлений.
1. 4. В методе onMeasure измеряются ширина и высота представлений членов семьи.
1. 5. В методе onLayout устанавливаются конкретные положения каждого члена семьи.
1. 6. В методе onDraw используется canvas для отрисовки линий, связывающих членов семьи.
1. 7. В методе onTouchEvent записывается обработка событий касания для перемещения ViewGroup, а в методе onInterceptTouchEvent записывается, будет ли перехватываться событие касания представления члена семьи.

2. Поток определения положений

1. Определение положений начинается с нижнего уровня и постепенно поднимается вверх, так как определение положения нижнего уровня позволяет определить положение верхнего уровня.
2. Порядок шагов: (1)(2) → (3) → (4)(5) → (6)(7) → (8)(9)(10) → (11)(12) → (13)(14). Конкретная логика можно увидеть в методе initView().
3.Поскольку логика определения положений для (1)(2), (4)(5) и (11)(12) схожа, а также для (6)(7) и (13)(14), эти шаги были объединены в одинаковые методы, передавая в них поколение и источник данных. Метод для определения положений меня и моей супруги (3) был написан отдельно из-за его специфичности, а также метод для определения положений родителей, дедушек и бабушек, а также дедушек и бабушек по материнской линии был написан отдельно из-за их специфичности.

! Структурная схема

3. Поток отрисовки линий

1. Рисуются линии, связывающие каждый член семьи: (1)(2) → (4)(5) → (6)(7) → (11)(12) → (13)(14) → (3) → (8) → (9) → (10)
2. Рисуются линии, связывающие части: 
   Линии между детьми → Линии между братьями и сестрами и мной → Линии между дедушками и отцом → Линии между бабушками и матерью → Линии между отцом и его братьями и сестрами → Линии между матерью и ее братьями и сестрами. Конкретные детали трудно описать, но шаги были разделены в коде, поэтому можно изучить код для лучшего понимания.

Github: https://github.com/ssj64260/FamilyTreeView

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Демо создания генеалогического древа, в основном используя пользовательский ViewGroup и используя canvas для рисования линий. На данном этапе реализовано рисование себя, супруга, братьев и сестёр, родителей, дедушек и бабушек, дядей и тётей, детей и невесток, зятьёв и внуков — всего пять поколений. Добавлена возможность перемещения при помощи to... Развернуть Свернуть
Отмена

Обновления

Пока нет обновлений

Участники

все

Язык

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/coku2333-FamilyTreeView.git
git@api.gitlife.ru:oschina-mirror/coku2333-FamilyTreeView.git
oschina-mirror
coku2333-FamilyTreeView
coku2333-FamilyTreeView
master