2014-10-26 3 views
24

Я пытаюсь использовать свойство elevation в последнем выпуске предварительного просмотра Android Lollipop. Я установил targetSdk в 21 и тему в Material. Затем я добавил фоновое изображение в TextView и установил высоту в 8dp, но TextView не показывает никаких признаков тени. То есть на Nexus7 работает предварительный просмотр Lollipop. Есть ли что-то еще, что я должен рассмотреть?Высота на Android 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

ответ

57

По какой-то причине, если вы установите сплошной цвет с прозрачностью, тень не отображается вверх.

В вашем примере я изменил # 7d0073ff на # 0073ff, и у меня появилась тень.

Это, вероятно, ошибка, так как в их documentation он дает аналогичный пример, используя полупрозрачный цвет фона.

+0

спасибо за указание на это. Теперь он работает так, как ожидалось. :) – Moritz

+0

Я бы согласился, что это ошибка. Прозрачный цвет, который они используют, также не создает полупрозрачную тень. – Moritz

+0

Подъем всего «Фрагмента» для меня не работает. Может быть, потому, что весь его фон прозрачен? – tasomaniac

18

После просмотра документов снова я нашел решение.

Просто добавьте 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> 
+4

Card_view: cardUseCompatPadding = "true" Работал для меня. Дело в том, что тень показывалась на устройствах с предварительным леллипопом, но она не была показана на устройствах Lollipop [Nexus 9]. –

+0

@SherazAhmadKhilji Да, случилось то же самое со мной. –

9

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

<application 
    ... 
    android:hardwareAccelerated="true"> 
+1

если вы попробовали card_view: cardUseCompatPadding = "true", и это не сработало, это ваш ответ – Klaasel

+0

@ vcapra1: добавив android: hardwareAccelerated = "true", приложение вылетает. Ни один из решений не работает :( – UrMi

1

Попробуйте использовать : приложение: cardElevation = "4ДП"

+0

это не 'card_view: cardElevation =" 8dp "' – surfer190

+4

@ sufer190 "app" или "card_view" - оба просто пространства имен XML, поэтому оба они потенциально допустимы. – Ankhwatcher

17

ДОБАВЛЕНИЕ андроида: возвышение тень на ImageView:

android:clipToPadding="false" 
+ 
android:outlineProvider="bounds" 
+ 
android:elevation="2dp" 
3

TL; DR

Проверьте вашу карту (или что-то слово, которое вы используете) объявление пространства имен и убедитесь, что он соответствует этому: Xmlns: карта = "http://schemas.android. com/apk/res-auto "

Я знаю, что здесь есть несколько ответов, но я хотел добавить мой, поскольку он не был включен в эти текущие предложения.Для того, чтобы получить тень, работающую как на KitKat и Зефире, (только эмуляторы я пытался, я уверен, что он работает между) я добавил следующие атрибуты XML для моей карты:

card:cardElevation="25dp" 
card:cardUseCompatPadding="true" 

После стучали голову мой стол за то, почему это не работает, пытаясь установить цвет фона карты на что-то совершенно непрозрачное, что позволяет ускорить аппаратное ускорение в манифесте и даже молиться, я проверил объявления пространства имен в моем файле. К моему ужасу, я увидел, что пространство имен карты XML были присвоены следующим:

xmlns:card="http://schemas.android.com/tools" 

После фиксации, что объявление пространства имен, я побежал мой манекен приложение снова и вздохнул с облегчением, наконец показывала тень как и ожидалось.

Это доказательство на случай, если вы сомневаетесь, как я. И, пожалуйста, Google, Android, кто бы то ни было: снова создайте тени. Они не должны быть такими трудными.

enter image description here

Вот весь файл, который создал макет на рисунке ниже:

<?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, но я оставил его там специально. Вы должны обязательно check это out. Супер мощный, очень полезный. Приятно приятно. Надеюсь, это помогло.

2

Как отмечалось ранее, это 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> 

Результат:

Result

Несколько примечательных точек:

  • Вы должны обеспечить го на прилагаемом RelativeLayout достаточно большой, чтобы отобразить тень. Если вы просто установите его размеры на wrap_content без заполнения, тень будет привязана к границам макета. Как объясняется в this question, вы можете использовать прописку и установить android:cipToPadding="false", чтобы сделать ее достаточно большой для тени. В этом случае вам может не понадобиться столько отступов, я не экспериментировал с этим.
  • В этом случае нам нужно использовать отдельное представление для фона, потому что, если бы мы установили alpha непосредственно на TextView, тогда текст также был бы затронут.В зависимости от вашего варианта использования вам может не понадобиться отдельный вид и охватывающий макет, и у него может быть просто один вид, с alpha, установленным на вид и без прозрачности в чертеже.
3

знать, если у вас есть следующие строки в манифесте, то тень обыкновения шоу:

андроида: hardwareAccelerated = «ложное»

+0

Трудная проблема для поиска , –

Смежные вопросы