Рендеринг ViewGroup на холсте

Я реализую небольшую библиотеку для легкого добавления настраиваемых действий просмотра вида на RecyclerView. Во время моей реализации я столкнулся с проблемой при визуализации представлений на холсте. Я приложил gif здесь, чтобы продемонстрировать проблему:

витрина

Рисуя вид смахивания на холсте, я делаю следующее:

    private fun renderSwipeView(
        view: View,
        c: Canvas,
        width: Int,
        height: Int,
        transX: Float,
        transY: Float
    ) {
        view.measure(
            View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.EXACTLY),
            View.MeasureSpec.makeMeasureSpec(height, View.MeasureSpec.EXACTLY)
        )
        view.layout(0, 0, width, height)

        c.withTranslation(transX, transY) {
            view.draw(c)
        }
    }

Это обычно работает нормально, но я вижу проблемы рендеринга с типами представления. В GIF i Зеленый макет - это квадрат, который центрирован по верху макета. Так что я знаю, что макет отображается в правильном размере, а макет элементов выполнен правильно.

Проблема 1: Синие блоки - это TextView с singleLine=true поскольку я хочу, чтобы текст был аккуратно раскрыт элементом сверху. Смахивание вправо в основном работает нормально, однако при пролистывании влево текст не отображается вообще. Я попытался отрисовать этот же случай, не разыскивая его на холсте, который отлично работает. Я пропускаю какую-то часть при рендеринге моего изображения на холсте?

Проблема 2: Не очень большая проблема, но вид смахивания (красный / оранжевый контейнер) будет отображаться вне его макета. Я мог бы легко исправить это, используя canvas.clipRect() на холсте, но я бы хотел устранить причину этого, а не делать обходной путь.

Весь исходный код с этой демонстрацией можно увидеть здесь .

Спасибо С наилучшими пожеланиями

Всего 1 ответ


Относительно вопроса 1: мне только удалось сначала выпустить. Похоже, что это связано с ошибкой в ​​TextView, при переключении на AppCompatTextView проблема была решена.


Есть идеи?

10000