Skip to content

Conversation

@Victoria282
Copy link

photo_2025-07-22_15-42-02

video_2025-07-22_15-42-08.mp4

…ем визуализировать траты по категориям:

Обязательно реализуйте метод 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) {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

можно упросить через resolveSize(desiredWidth, widthMeasureSpec), он под капотом делает аналогичную обработку, тогда и wMode ну нужен будет и код станет сильно короче, аналогично с высотой

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) {

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 {

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 {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

полный рандом возможно не лучшее решение, разные категории могут получить схожие цвета, возможно было бы лучше скорректировать генерацию под какие то условия (например, взять число категорий и равномерно разбить эти цвета на спектре), тогда бы и сохранять их не пришлось в стейте

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants