Тень возвышения CardView не отцентрирована? - PullRequest
0 голосов
/ 31 декабря 2018

У меня CardView определено как

<androidx.cardview.widget.CardView
    android:layout_width="70dp"
    android:layout_height="70dp"
    app:cardCornerRadius="35dp"
    app:cardElevation="10dp">
    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="fitXY"
        android:src="@drawable/ic_user_default"/>
</androidx.cardview.widget.CardView>

Но каким-то образом я получаю эту странную тень, которую я не могу понять, почему?enter image description here

Я хотел, чтобы у меня был круговой CardView с круглой тенью вокруг него, но вместо этого я получаю тень в правом нижнем углу.

Что такоеЯ пропустил?

Я попробовал несколько вещей, и вот к чему я пришел.

CardView находится внутри RelativeLayout, который имеет wrap_content как layout_height.Я предполагаю, что это только упаковка CardView, без тени.Посмотрите на приведенный ниже пример.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center">
    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
        <androidx.cardview.widget.CardView
            android:layout_width="70dp"
            android:layout_height="70dp"
            app:cardCornerRadius="35dp"
            app:cardElevation="10dp">
        </androidx.cardview.widget.CardView>
    </RelativeLayout>

    <androidx.cardview.widget.CardView
        android:layout_width="70dp"
        android:layout_height="70dp"
        app:cardCornerRadius="35dp"
        app:cardElevation="10dp">
    </androidx.cardview.widget.CardView>

</LinearLayout>

, который будет отображаться как enter image description here

Так что возникает вопрос, почему он оборачивается вокруг CardView, а не CardViewсо своими тенями?И один побочный вопрос.Как вы центрируете тень CardView?Если вы присмотритесь ко второму CardView, тень будет иметь гравитацию снизу.

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

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

enter image description here

Высотаиз этих источников света по умолчанию 90 градусов и 45 градусов соответственно в структуре Android, и не могут быть изменены, потому что это было бы несовместимо с дизайном материала.Однако, если вы хотите создать собственную тень с настраиваемым углом, вы можете использовать градиентную прорисовку и установить ее как тень, как описано здесь под заголовком Использование Shape Drawable (Newспособ реализации тени) .

По сути, вам нужно использовать метод setShadowLayer из класса android.graphics.Paint.

Надеюсь, это поможет!

0 голосов
/ 31 декабря 2018

Отклонение тени CardView зависит от ее расположения на экране.Как вы можете видеть на картинке ниже, когда CardView находится в левой или правой части экрана, его тень также отклоняется влево или вправо.

enter image description here

Однако, AFAIK, у нас нет контроля над теневой перспективой CardView, так как нет атрибута, который можно изменить.Если вы хотите создать собственную тень, вы должны сделать это самостоятельно.

...