Когда карточки высокие и появляются в нижней части экрана, тень контура пятна заметно смещается по вертикали. Я понимаю, что Android именно так отображает тени, но в данном конкретном случае смещение становится слишком большим и приводит к визуальным артефактам.


Эта проблема воспроизводится в минимальном проекте: Activity + RecyclerView. Просто создайте новый проект в студии Android и добавьте код из разделов ниже:
Код: Выделить всё
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
setupRecycler(generateItems())
}
private fun generateItems(): List = List(15) { index ->
CardAdapter.CardItem(
title = "Card ${index + 1}",
description = buildString {
repeat((15..40).random()) { append("Test line\n") }
}
)
}
private fun setupRecycler(cardItems: List) = binding.recyclerView.apply {
layoutManager = LinearLayoutManager(context)
adapter = CardAdapter(cardItems)
val spacingInPixels = resources.getDimensionPixelSize(R.dimen.card_spacing)
addItemDecoration(SpacingItemDecoration(spacingInPixels))
}
}
Код: Выделить всё
[*] xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context=".MainActivity">
Код: Выделить всё
class CardAdapter(private val items: List) : RecyclerView.Adapter() {
data class CardItem(
val title: String,
val description: String
)
inner class CardViewHolder(private val binding: ItemCardBinding) : RecyclerView.ViewHolder(binding.root) {
fun bind(item: CardItem) {
binding.cardTitle.text = item.title
binding.cardDescription.text = item.description
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CardViewHolder {
val binding = ItemCardBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return CardViewHolder(binding)
}
override fun onBindViewHolder(holder: CardViewHolder, position: Int) {
holder.bind(items[position])
}
override fun getItemCount(): Int = items.size
}
Код: Выделить всё
Код: Выделить всё
rounded
0dp
16dp
16dp
16dp
- Заменил MaterialCardView на обычный LinearLayout + рисуемый фон формы → проблема с тенями все еще возникает (поэтому это не похоже на ошибку MaterialCardView)
- Протестировано несколько версий библиотеки компонентов материалов
- Проверено XML-атрибуты, такие как:
app:useCompatPadding="true"
app:preventCornerOverlap="true"
android:clipToPadding="false" / clipToOutline варианты - Экспериментировал с различными настройками высоты, отступа и контура
Ничего из этого не помогло — тень по-прежнему смещается вниз слишком далеко, когда вид имеет неровные угловые радиусы.
Существует ли какой-либо обходной путь, позволяющий предотвратить или уменьшить это вертикальное смещение тени при использовании асимметричных фигур с закругленными углами в качестве элементов в RecyclerView?
Будем очень признательны за любые предложения или идеи.>
Подробнее здесь: https://stackoverflow.com/questions/798 ... ven-corner
Мобильная версия