Я искал вокруг, и я не мог найти правильный способ сделать это. Я хочу иметь следующие теневые эффекты для моих видов:
Если честно, я не знаю, если это второе сделано с применением эффекта тени. Есть идеи?
Я искал вокруг, и я не мог найти правильный способ сделать это. Я хочу иметь следующие теневые эффекты для моих видов:
Если честно, я не знаю, если это второе сделано с применением эффекта тени. Есть идеи?
Я знаю, что этот вопрос уже был дан ответ, но я хочу, чтобы вы знали, что я нашел drawable
on Android Studio
, который очень похож на фотографии, которые у вас есть в вопросе:
Взгляните на это:
android:background="@drawable/abc_menu_dropdown_panel_holo_light"
Он выглядит следующим образом:
Надеюсь, что это будет полезно
Edit
Этот вариант выше для старых версий Android Studio
, поэтому вы не можете его найти. Для более новых версий:
android:background="@android:drawable/dialog_holo_light_frame"
Кроме того, если вы хотите иметь свою собственную форму, я предлагаю использовать программное обеспечение для рисования, например Photoshop
, и нарисуйте его.
Не забудьте сохранить его как .9.png
файл (пример: my_background.9.png
)
Прочтите документацию: Рисовать 9-патч
Изменить 2
Еще лучше и менее трудоемкое решение - использовать CardView
и установить app:cardPreventCornerOverlap="false"
, чтобы предотвратить совпадение представлений.
<android.support.v7.widget.CardView
android:id="@+id/card_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:cardCornerRadius="2dp"
app:cardElevation="2dp"
app:cardPreventCornerOverlap="false"
app:contentPadding="0dp">
<!-- your layout stuff here -->
</android.support.v7.widget.CardView>
Также обязательно включите последнюю версию в build.gradle
, текущий
compile 'com.android.support:cardview-v7:26.0.0'
Я использую Android Studio 0.8.6, и я не смог найти:
android:background="@drawable/abc_menu_dropdown_panel_holo_light"
поэтому я нашел это вместо:
android:background="@android:drawable/dialog_holo_light_frame"
и выглядит следующим образом:
Создайте card_background.xml в папке res/drawable со следующим кодом:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<solid android:color="#BDBDBD"/>
<corners android:radius="5dp"/>
</shape>
</item>
<item
android:left="0dp"
android:right="0dp"
android:top="0dp"
android:bottom="2dp">
<shape android:shape="rectangle">
<solid android:color="#ffffff"/>
<corners android:radius="5dp"/>
</shape>
</item>
</layer-list>
Затем добавьте следующий код к элементу, к которому вы хотите макет карты
android:background="@drawable/card_background"
следующая строка определяет цвет тени для карты
<solid android:color="#BDBDBD"/>
размещение фона @android:drawable/dialog_holo_light_frame
, дает тень, но вы не можете изменить цвет фона или стиль рамки, поэтому лучше извлечь выгоду из тени его, сохраняя при этом фон через слой-лист
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!--the shadow comes from here-->
<item
android:bottom="0dp"
android:drawable="@android:drawable/dialog_holo_light_frame"
android:left="0dp"
android:right="0dp"
android:top="0dp">
</item>
<item
android:bottom="0dp"
android:left="0dp"
android:right="0dp"
android:top="0dp">
<!--whatever you want in the background, here i preferred solid white -->
<shape android:shape="rectangle">
<solid android:color="@android:color/white" />
</shape>
</item>
</layer-list>
сохраните его в папке с возможностью вырезания в разделе say shadow.xml
чтобы присвоить его представлению, в файле макета xml установите его фон
android:background="@drawable/shadow"
CardView дает тень true в android 5+ и имеет библиотеку поддержки. Просто заверните свое мнение, и все готово.
<android.support.v7.widget.CardView>
<MyLayout>
</android.support.v7.widget.CardView>
Требуется следующая зависимость.
dependencies {
...
compile 'com.android.support:cardview-v7:21.0.+'
}
Используйте свойство elevation для достижения эффекта тени:
<View ...
android:elevation="2dp"/>
Это только для использования в прошлом v21, посмотрите эту ссылку: http://developer.android.com/training/material/shadows-clipping.html
Это может быть поздно, но для тех, кто все еще ищет ответ, я нашел проект в концентраторе git, и это единственное, что действительно соответствует моим потребностям. android-materialshadowninepatch
Просто добавьте эту строку в свою зависимость build.gradle
compile 'com.h6ah4i.android.materialshadowninepatch:materialshadowninepatch:0.6.3'
приветствий. палец вверх для создателя! happycodings
Если вам нужно, чтобы тени были правильно нанесены, вам нужно сделать следующее.
Рассмотрим это представление, определенное с помощью фона для рисования:
<TextView
android:id="@+id/myview"
...
android:elevation="2dp"
android:background="@drawable/myrect" />
Нарисованный фон определяется как прямоугольник с закругленными углами:
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#42000000" />
<corners android:radius="5dp" />
</shape>
Это рекомендуемый способ применения теней. Проверьте это https://developer.android.com/training/material/shadows-clipping.html#Shadows
Используйте свойство высоты для влияния тени:
<YourView
...
android:elevation="3dp"/>
Я знаю, это глупо,
но если вы хотите поддержать под v21, вот мои достижения.
rectangle_with_10dp_radius_white_bg_and_shadow.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Shadow layers -->
<item
android:left="1dp"
android:right="1dp"
android:top="3dp">
<shape>
<corners android:radius="10dp" />
<padding
android:bottom="1.8dp"
android:left="1dp"
android:right="1dp"
android:top="1dp" />
<solid android:color="@color/shadow_hack_level_1" />
</shape>
</item>
<item
android:left="1dp"
android:right="1dp"
android:top="3dp">
<shape>
<corners android:radius="10dp" />
<padding
android:bottom="1.8dp"
android:left="1dp"
android:right="1dp"
android:top="1dp" />
<solid android:color="@color/shadow_hack_level_2" />
</shape>
</item>
<item
android:left="1dp"
android:right="1dp"
android:top="3dp">
<shape>
<corners android:radius="10dp" />
<padding
android:bottom="1.8dp"
android:left="1dp"
android:right="1dp"
android:top="1dp" />
<solid android:color="@color/shadow_hack_level_3" />
</shape>
</item>
<item
android:left="1dp"
android:right="1dp"
android:top="3dp">
<shape>
<corners android:radius="10dp" />
<padding
android:bottom="1.8dp"
android:left="1dp"
android:right="1dp"
android:top="1dp" />
<solid android:color="@color/shadow_hack_level_4" />
</shape>
</item>
<item
android:left="1dp"
android:right="1dp"
android:top="3dp">
<shape>
<corners android:radius="10dp" />
<padding
android:bottom="1.8dp"
android:left="1dp"
android:right="1dp"
android:top="1dp" />
<solid android:color="@color/shadow_hack_level_5" />
</shape>
</item>
<item
android:left="1dp"
android:right="1dp"
android:top="3dp">
<shape>
<corners android:radius="10dp" />
<padding
android:bottom="1.8dp"
android:left="1dp"
android:right="1dp"
android:top="1dp" />
<solid android:color="@color/shadow_hack_level_6" />
</shape>
</item>
<item
android:left="1dp"
android:right="1dp"
android:top="3dp">
<shape>
<corners android:radius="10dp" />
<padding
android:bottom="1.8dp"
android:left="1dp"
android:right="1dp"
android:top="1dp" />
<solid android:color="@color/shadow_hack_level_7" />
</shape>
</item>
<item
android:left="1dp"
android:right="1dp"
android:top="3dp">
<shape>
<corners android:radius="10dp" />
<padding
android:bottom="1.8dp"
android:left="1dp"
android:right="1dp"
android:top="1dp" />
<solid android:color="@color/shadow_hack_level_8" />
</shape>
</item>
<item
android:left="1dp"
android:right="1dp"
android:top="3dp">
<shape>
<corners android:radius="10dp" />
<padding
android:bottom="1.8dp"
android:left="1dp"
android:right="1dp"
android:top="1dp" />
<solid android:color="@color/shadow_hack_level_9" />
</shape>
</item>
<item
android:left="1dp"
android:right="1dp"
android:top="3dp">
<shape>
<corners android:radius="10dp" />
<padding
android:bottom="1.8dp"
android:left="1dp"
android:right="1dp"
android:top="1dp" />
<solid android:color="@color/shadow_hack_level_10" />
</shape>
</item>
<!-- Background layer -->
<item>
<shape>
<solid android:color="@android:color/white" />
<corners android:radius="10dp" />
</shape>
</item>
</layer-list>
rectangle_with_10dp_radius_white_bg_and_shadow.xml (v21)
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@android:color/white" />
<corners android:radius="10dp" />
</shape>
view_incoming.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/rectangle_with_10dp_radius_white_bg_and_shadow"
android:elevation="7dp"
android:gravity="center"
android:minWidth="240dp"
android:minHeight="240dp"
android:orientation="horizontal"
android:padding="16dp"
tools:targetApi="lollipop">
<TextView
android:id="@+id/text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="Hello World !" />
</LinearLayout>
Вот результат:
Под v21 (это вы сделали с xml)
Выше v21 (рендеринг реальной высоты)
использовать эту форму в качестве фона:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:drawable/dialog_holo_light_frame"/>
<item>
<shape android:shape="rectangle">
<corners android:radius="1dp" />
<solid android:color="@color/gray_200" />
</shape>
</item>
</layer-list>
Создайте фон для рисования, чтобы показать округлую тень.
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Drop Shadow Stack -->
<item>
<shape>
<corners android:radius="4dp" />
<padding android:bottom="1dp" android:left="1dp"
android:right="1dp" android:top="1dp" />
<solid android:color="#00CCCCCC" />
</shape>
</item>
<item>
<shape>
<corners android:radius="4dp" />
<padding android:bottom="1dp" android:left="1dp"
android:right="1dp" android:top="1dp" />
<solid android:color="#10CCCCCC" />
</shape>
</item>
<item>
<shape>
<corners android:radius="4dp" />
<padding android:bottom="1dp" android:left="1dp"
android:right="1dp" android:top="1dp" />
<solid android:color="#20d5d5d5" />
</shape>
</item>
<item>
<shape>
<corners android:radius="6dp" />
<padding android:bottom="1dp" android:left="1dp"
android:right="1dp" android:top="1dp" />
<solid android:color="#30cbcbcb" />
</shape>
</item>
<item>
<shape>
<corners android:radius="4dp" />
<padding android:bottom="1dp" android:left="1dp"
android:right="1dp" android:top="1dp" />
<solid android:color="#50bababa" />
</shape>
</item>
<!-- Background -->
<item>
<shape>
<solid android:color="@color/gray_100" />
<corners android:radius="4dp" />
</shape>
</item>
</layer-list>
Вы можете создать тень для рисования отсюда: -
Этот вопрос может быть старым, но для любого в будущем, кто хочет простой способ достигнуть сложных эффектов тени, проверьте мою библиотеку здесь https://github.com/BluRe-CN/ComplexView
Используя библиотеку, вы можете изменять цвета теней, настраивать края и многое другое. Вот пример для достижения того, что вы ищете.
<com.blure.complexview.ComplexView
android:layout_width="400dp"
android:layout_height="600dp"
app:radius="10dp"
app:shadow="true"
app:shadowSpread="2">
<com.blure.complexview.ComplexView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:color="#fdfcfc"
app:radius="10dp" />
</com.blure.complexview.ComplexView>
Чтобы изменить цвет тени, используйте app: shadowColor = "ваш цветовой код".