-
Notifications
You must be signed in to change notification settings - Fork 159
Canvas Домашнее задание #124
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Conversation
…ем визуализировать траты по категориям: Обязательно реализуйте метод onMeasure и учтите все возможные MeasureSpecs Реализуйте механизм сохранения состояния внутри View Предусмотрите как минимум 10 категорий(цветов) на графике В качестве данных для визуализации используйте файл payload.json Реализуйте механизм обработки клика на сектор - по клику на часть графика должен срабатывать коллбек, в качестве аргумента - категория на которой был клик евент.
…тегории, чтобы можно было смотреть траты по одной категории в динамике: По оси Y сумма трат в день, по оси Х дата(шаг по оси Х = 1 дню) Обязательно реализуйте метод onMeasure и учтите все возможные MeasureSpecs Реализуйте механизм сохранения состояния внутри View В качестве данных для визуализации используйте файл payload.json Реализовывать масштабирование/скроллинг/обработку тач евентов не нужно
| val wMode = MeasureSpec.getMode(widthMeasureSpec) | ||
| val hMode = MeasureSpec.getMode(heightMeasureSpec) | ||
|
|
||
| when (wMode) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
можно упросить через resolveSize(desiredWidth, widthMeasureSpec), он под капотом делает аналогичную обработку, тогда и wMode ну нужен будет и код станет сильно короче, аналогично с высотой
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
как пример для ширины:
val paddingWidth = paddingStart + paddingEnd
val minWidth = suggestedMinimumWidth + paddingWidth
val desiredBlocksWidth = (defaultBlockWidth * categories.size).toInt() + paddingWidth
val desiredWidth = max(minWidth, desiredBlocksWidth)
далее аналогично считаем для высоты и:
setMeasuredDimension(
resolveSize(desiredWidth, widthMeasureSpec),
resolveSize(desiredHeight, heightMeasureSpec)
)
defaultBlockWidth нужно задавать изначально в dp и потом пересчитывать в пиксели, сейчас он 30 пикселей, и будет по разному смотреться на разных экранах
| override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { | ||
| val wMode = MeasureSpec.getMode(widthMeasureSpec) | ||
| val hMode = MeasureSpec.getMode(heightMeasureSpec) | ||
| when (wMode) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
аналогично onMeasure в CategoryView
| } | ||
| } | ||
|
|
||
| fun List<PayloadData>.mapCategories(): List<Category> = this.map { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
как и в mapPieces отсутствует группировка по дням, просто идут записи, в одной категории может быть несколько трат за день
| ) | ||
| } | ||
|
|
||
| private fun generateColor(): Int { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
полный рандом возможно не лучшее решение, разные категории могут получить схожие цвета, возможно было бы лучше скорректировать генерацию под какие то условия (например, взять число категорий и равномерно разбить эти цвета на спектре), тогда бы и сохранять их не пришлось в стейте
photo_2025-07-22_15-42-02
video_2025-07-22_15-42-08.mp4