Возвышение на Android Lollipop не работает
Я пытаюсь использовать свойство elevation в последнем выпуске предварительного просмотра Android Lollipop. Я установил targetSdk в 21 и тему в Material. Затем я добавил фоновое изображение в TextView и установил высоту в 8dp, но TextView не показывает никаких признаков тени. То есть на Nexus7 работает предварительный просмотр Lollipop. Есть ли что-нибудь еще, что я должен рассмотреть?
Вот макет:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/rect"
android:text="hallo world"
android:padding="8dp"
android:elevation="8dp" />
</LinearLayout>
Это фоновый рисунок:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#7d0073ff" />
<corners android:radius="16dp" />
</shape>
Вот TextView:
![Android elevation]()
Ответы
Ответ 1
По какой-то причине, если вы установили сплошной цвет с прозрачностью, тень высоты не появится.
В вашем примере я изменил # 7d0073ff на # 0073ff, и у меня появилась тень.
Это, вероятно, ошибка, как в документации , она дает аналогичный пример, используя полупрозрачный цвет фона.
Ответ 2
После просмотра документов снова я нашел решение.
Просто добавьте card_view:cardUseCompatPadding="true"
к вашему CardView
, и тени появятся на устройствах Lollipop.
Что происходит, область содержимого в CardView
принимает разные размеры на устройствах с предварительным леоптипом и леденцом. Таким образом, в устройствах с леденец тень на самом деле покрыта картой, поэтому ее не видно. Добавляя этот атрибут, область содержимого остается неизменной для всех устройств, и тень становится видимой.
Мой xml-код похож:
<android.support.v7.widget.CardView
android:id="@+id/media_card_view"
android:layout_width="match_parent"
android:layout_height="130dp"
card_view:cardBackgroundColor="@android:color/white"
card_view:cardElevation="2sp"
card_view:cardUseCompatPadding="true"
>
...
</android.support.v7.widget.CardView>
Ответ 3
ДОБАВЛЯЕТ андроид: тень для изображения в ImageView:
android:clipToPadding="false"
+
android:outlineProvider="bounds"
+
android:elevation="2dp"
Ответ 4
У меня также была эта проблема, и, как оказалось, вам нужно включить аппаратное ускорение в манифесте Android.
<application
...
android:hardwareAccelerated="true">
Ответ 5
помните, если в манифесте есть следующая строка, тени не будут отображаться:
Android: hardwareAccelerated = "ложь"
Ответ 6
TL; DR
Проверьте свою карточку: (или любое другое слово, которое вы используете), и убедитесь, что она соответствует этому: xmlns: card = "http://schemas.android.com/apk/res-auto"
Я знаю, что здесь есть несколько ответов, но я хотел добавить мой, поскольку он не был включен в эти текущие предложения. Чтобы получить тени, работающие как на KitKat, так и на Marshmallow (только эмуляторы, которые я пробовал, я уверен, что это работает между ними), я добавил следующие атрибуты xml на свою карточку:
card:cardElevation="25dp"
card:cardUseCompatPadding="true"
После того, как я ударил головой о стол, почему это не работает, пытаясь установить цвет фона карты на что-то совершенно непрозрачное, включив аппаратное ускорение в манифесте и даже молясь, я проверил объявления пространства имен в моем файл. К моему ужасу, я увидел, что пространство имен xml-карты было присвоено следующему:
xmlns:card="http://schemas.android.com/tools"
После исправления этого объявления пространства имен я снова запустил свое фиктивное приложение и облегченно вздохнул, когда тени наконец-то были показаны, как ожидалось.
Вот доказательство, если вы сомневаетесь, как я. И, пожалуйста, Google, Android, кто бы то ни было: снова создайте тени. Они не должны быть такими трудными.
![введите описание изображения здесь]()
Вот весь файл, который создал макет, изображенный ниже:
<?xml version="1.0" encoding="utf-8"?>
<!--MAKE SURE YOU HAVE THE RIGHT XML NAMESPACE ASSIGNED-->
<!--TO WHATEVER WORD YOU PUT IN FRONT OF THE CARD-->
<!--XML ATTRIBUTES. IN THIS CASE, MINE IS card-->
<android.support.percent.PercentRelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:card="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#607D8B"
android:fitsSystemWindows="true"
tools:context="com.mlustig.playground.MainActivity">
<android.support.v7.widget.CardView
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_centerInParent="true"
app:layout_aspectRatio="66%"
app:layout_heightPercent="75%"
card:cardElevation="25dp"
card:cardUseCompatPadding="true" />
</android.support.percent.PercentRelativeLayout>
Да, я знаю. Это раздражает, что вы не можете просто скопировать и вставить этот макет и запустить его, потому что в нем есть PercentRelativeLayout, но я оставил его там специально. Вы должны определенно проверить out. Супер мощный, очень полезный. Приятно приятно. Надеюсь, это помогло.
Ответ 7
Как отмечалось ранее, это open bug в Android: если фоновый ресурс использует сплошной цвет с прозрачностью, тогда тень выиграла Не будет показано.
Чтобы обойти проблему, отобразите фон в своем отдельном представлении и установите альфа в этом представлении. Оберните фоновое изображение и TextView
в RelativeLayout
, чтобы поместить фон непосредственно под TextView
и используйте android:layout_alignLeft
, android:layout_alignBottom
и т.д., Чтобы сделать его того же размера. Они должны быть на одинаковом уровне, и фон должен появиться перед TextView
в xml, чтобы он рисовался под ним.
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="40dp"
android:paddingRight="40dp"
android:paddingTop="20dp"
android:paddingBottom="20dp"
android:clipToPadding="false"
android:background="#ffffff">
<View
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/text_view"
android:layout_alignRight="@id/text_view"
android:layout_alignBottom="@id/text_view"
android:layout_alignTop="@id/text_view"
android:background="@drawable/rect"
android:alpha="0.5"
android:elevation="8dp"/>
<TextView
android:id="@id/text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="hallo world"
android:textColor="#ffffff"
android:padding="8dp"
android:elevation="8dp" />
</RelativeLayout>
Выбираемый те же, что и ваш, но без прозрачности:
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#0073ff" />
<corners android:radius="16dp" />
</shape>
Результат:
![Результат]()
Несколько заметных точек:
- Вы должны убедиться, что охватывающий
RelativeLayout
достаточно большой, чтобы отобразить тень. Если вы просто установите его размеры на wrap_content
без заполнения, тень будет привязана к границам макета. Как объяснено в этом вопросе, вы можете использовать padding и установить android:cipToPadding="false"
, чтобы сделать его достаточно большим для тени. В этом случае вам может не понадобиться столько отступов, я не экспериментировал с этим.
- В этом случае нам нужно использовать отдельное представление для фона, потому что, если бы мы установили
alpha
непосредственно на TextView
, тогда текст также был бы затронут. В зависимости от вашего варианта использования вам может не понадобиться отдельный вид и охватывающий макет, и он может просто иметь только один вид, а alpha
установлен на вид и прозрачность в drawable.
Ответ 8
Попробуйте использовать: app: cardElevation = "4dp"
Ответ 9
Попробуйте добавить поле к CardView
.