Я реализую небольшую библиотеку для простого добавления настраиваемых действий смахивания представления в 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()
на холсте, но я бы хотел устранить причину root, а не делать обходной путь.
Весь исходный код этой демонстрации можно увидеть здесь .
Спасибо С уважением