Тень контура пятна имеет нежелательное вертикальное смещение, если форма вида имеет неровные углы и используется как элеAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Тень контура пятна имеет нежелательное вертикальное смещение, если форма вида имеет неровные углы и используется как эле

Сообщение Anonymous »

Я столкнулся с проблемой компоновки вертикального RecyclerView, в котором используются элементы MaterialCards с пользовательской shapeAppearanceOverlay, которая имеет асимметричные углы (радиус верхнего левого угла = 0dp, все остальные углы = 16dp).
Когда карточки высокие и появляются в нижней части экрана, тень контура пятна заметно смещается по вертикали. Я понимаю, что 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»