Я предлагаю вам взглянуть на документацию для Android по теням .
Вы сказали:
CardView находится внутри RelativeLayout, который имеет wrap_content
какlayout_height
.Я предполагаю, что это только упаковка CardView, без тени.Так что возникает вопрос, почему он оборачивается вокруг CardView, а не CardView с его тенями?
Ответы на следующие вопросы почему:
Тени рисуются родителемрасширенный вид и, следовательно, подлежит стандартному отсечению вида, по умолчанию обрезается родительским элементом.
Также:
Границы фона для рисования, определяемого по умолчанию, определяют форму по умолчанию дляего тень.Рассмотрим этот вид, заданный с помощью фона для рисования:
<TextView
android:id="@+id/myview"
...
android:elevation="2dp"
android:background="@drawable/myrect" />
Фон для рисования определяется как прямоугольник с закругленными углами:
<!-- res/drawable/myrect.xml -->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#42000000" />
<corners android:radius="5dp" />
</shape>
Вид отбрасывает тень со скругленными углами, так как фон, который можно нарисовать, определяет контур вида.Предоставление пользовательского контура переопределяет стандартную форму тени представления.
Это вы уже достигли с помощью app:cardCornerRadius="35dp"
, а не настраиваемого фона для рисования (что в равной степени приемлемо, хотя я подумал добавить этот битинформация может быть полезна, если в будущем она понадобится вам для других представлений).
Чтобы ответить на вопрос Как вы отцентрируете тень CardView? вы можете взглянуть на рекомендации по проектированию материалов .Согласно Material Design, тени должны исходить как от внешнего освещения (передний источник света), так и от основного света (верхний источник света):
Высотаиз этих источников света по умолчанию 90 градусов и 45 градусов соответственно в структуре Android, и не могут быть изменены, потому что это было бы несовместимо с дизайном материала.Однако, если вы хотите создать собственную тень с настраиваемым углом, вы можете использовать градиентную прорисовку и установить ее как тень, как описано здесь под заголовком Использование Shape Drawable (Newспособ реализации тени) .
По сути, вам нужно использовать метод setShadowLayer
из класса android.graphics.Paint
.
Надеюсь, это поможет!