Android "высота" не показывает тень
У меня есть ListView, и с каждым элементом списка я хочу, чтобы он показывал тень под ним. Я использую новую функцию высоты Android Lollipop, чтобы установить Z на вид, который я хочу отбросить тень, и уже делаю это эффективно с помощью ActionBar (технически панель инструментов в Lollipop). Я использую высоту Lollipop, но по какой-то причине он не показывает тень под элементами списка. Вот как настраивается макет каждого элемента списка:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
style="@style/block"
android:gravity="center"
android:layout_gravity="center"
android:background="@color/lightgray"
>
<RelativeLayout
android:layout_width="300dp"
android:layout_height="300dp"
android:layout_marginLeft="40dp"
android:layout_marginRight="40dp"
android:layout_marginTop="20dp"
android:layout_marginBottom="20dp"
android:elevation="30dp"
>
<ImageView
android:id="@+id/documentImageView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop" />
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/alphared"
android:layout_alignParentBottom="true" >
<appuccino.simplyscan.Extra.CustomTextView
android:id="@+id/documentName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@color/white"
app:typeface="light"
android:paddingLeft="16dp"
android:paddingTop="8dp"
android:paddingBottom="4dp"
android:singleLine="true"
android:text="New Document"
android:textSize="27sp"/>
<appuccino.simplyscan.Extra.CustomTextView
android:id="@+id/documentPageCount"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@color/white"
app:typeface="italic"
android:paddingLeft="16dp"
android:layout_marginBottom="16dp"
android:text="1 page"
android:textSize="20sp"/>
</LinearLayout>
</RelativeLayout>
</RelativeLayout>
однако, вот как это показано элемент списка, без тени:

Я также пробовал следующие безуспешно:
- установите высоту для ImageView и TextViews сами вместо родительского макета.
- применил фон к ImageView.
- используется TranslationZ вместо высоты.
16 ответов:
я немного поиграл с тенями на леденце, и вот что я нашел:
- похоже, что родитель
ViewGroupграницы отсекают тень своих детей по какой-то причине; и- тени набор с
android:elevationотрезаны отViewграницы, а не границы, проходящие через поле;- правильный способ получить дочерний вид, чтобы показать тень, чтобы установить отступ на родителя и установить
android:clipToPadding="false"на что родитель.вот мое предложение вам на основе того, что я знаю:
- Установите свой верхний уровень
RelativeLayoutчтобы отступы были равны полям, которые вы установили на относительном макете, который вы хотите показать тень;- set
android:clipToPadding="false"в той жеRelativeLayout;- удалите поля из
RelativeLayoutкоторый также имеет Набор высот;- [EDIT] вам также может потребоваться установить непрозрачный цвет фона на дочернем макете, который требуется высота.
в конце концов, ваш относительный макет верхнего уровня должен выглядеть так:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" style="@style/block" android:gravity="center" android:layout_gravity="center" android:background="@color/lightgray" android:paddingLeft="40dp" android:paddingRight="40dp" android:paddingTop="20dp" android:paddingBottom="20dp" android:clipToPadding="false" >внутренняя относительная планировка должна выглядеть так:
<RelativeLayout android:layout_width="300dp" android:layout_height="300dp" android:background="[some non-transparent color]" android:elevation="30dp" >
Если у вас есть вид без фона эта строка поможет вам
android:outlineProvider="bounds"по умолчанию тень определяется фоном вида, поэтому, если фона нет, тени также не будет.
по-видимому, вы не можете просто установить высоту на виде и показать ее. Также необходимо указать фон.
следующие строки, добавленные в мой LinearLayout, наконец, показали тень:
android:background="@android:color/white" android:elevation="10dp"
еще одна вещь, о которой вы должны знать, тени не будут отображаться, если у вас есть эта строка в манифесте:
android: hardwareAccelerated= "false"
Я попробовал все предложенные вещи, но это сработало только для меня, когда я удалил строку, причина, по которой у меня была строка, заключалась в том, что мое приложение работает с несколькими растровыми изображениями, и они вызывали сбой приложения.
Если вы добавляете высоту к элементу button, вам нужно добавить следующую строку:
android:stateListAnimator="@null"посмотреть Android 5.0 android: высота работает для просмотра, но не кнопка?
тьфу, просто потратил час, пытаясь выяснить это. В моем случае у меня был набор фона, однако он был установлен в цвет. Это не достаточно, вы должны иметь в фоне просмотр в мешочки.
например, Это не будет иметь тени:
<LinearLayout android:layout_width="match_parent" android:layout_height="165dp" android:background="@color/ight_grey" android:elevation="20dp" android:orientation="vertical" />но это
<LinearLayout android:layout_width="match_parent" android:layout_height="165dp" android:background="@drawable/selector_grey" android:elevation="20dp" android:orientation="vertical" />изменить: Также обнаружили, что если вы используете селектор в качестве фона, если у вас нет углового набора, то тень не будет отображаться в предварительный просмотр окно но он будет отображаться на устройстве
например, это не имеет тени в предварительном просмотре:
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item> <shape android:shape="rectangle"> <solid android:color="@color/white" /> <stroke android:width="1dp" android:color="@color/grey"/> </shape> </item> </selector>а это:
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item> <shape android:shape="rectangle"> <solid android:color="@color/white" /> <corners android:radius="1dp" /> <stroke android:width="1dp" android:color="@color/grey"/> </shape> </item> </selector>
добавление цвета фона помогло мне.
<CalendarView android:layout_width="match_parent" android:id="@+id/calendarView" android:layout_alignParentTop="true" android:layout_alignParentStart="true" android:layout_height="wrap_content" android:elevation="5dp" android:background="@color/windowBackground" />
Если у вас есть вид без фона эта строка поможет вам
android:outlineProvider="bounds"Если у вас есть вид с фоном эта строка поможет вам
android:outlineProvider="paddedBounds"
если вы хотите иметь прозрачный фон и
android:outlineProvider="bounds"не работает для вас, вы можете создать пользовательский ViewOutlineProvider:class TransparentOutlineProvider extends ViewOutlineProvider { @Override public void getOutline(View view, Outline outline) { ViewOutlineProvider.BACKGROUND.getOutline(view, outline); Drawable background = view.getBackground(); float outlineAlpha = background == null ? 0f : background.getAlpha()/255f; outline.setAlpha(outlineAlpha); } }и установите этого провайдера в свой прозрачный вид:
transparentView.setOutlineProvider(new TransparentOutlineProvider());источники: https://code.google.com/p/android/issues/detail?id=78248#c13
[редактирование] Документация мешочки.getAlpha () говорит, что это специфично для того, как рисуемые угрозы Альфа. Вполне возможно, что он всегда будет 255. В в этом случае вы можете предоставить Альфа-вручную:
class TransparentOutlineProvider extends ViewOutlineProvider { private float mAlpha; public TransparentOutlineProvider(float alpha) { mAlpha = alpha; } @Override public void getOutline(View view, Outline outline) { ViewOutlineProvider.BACKGROUND.getOutline(view, outline); outline.setAlpha(mAlpha); } }если ваш вид фона является StateListDrawable с цветом по умолчанию #DDFF0000 то есть с Альфа DDx0 / FFx0 = = 0.86
transparentView.setOutlineProvider(new TransparentOutlineProvider(0.86f));
иногда как фон= " @color/*" или background="#ff33 " не работает, я заменяю background_color на drawable, тогда он работает
дать некоторый цвет фона, чтобы макет работал для меня например:
android:background="@color/catskill_white" android:layout_height="?attr/actionBarSize" android:elevation="@dimen/dimen_5dp"
добавляя к принятому ответу, есть еще одна причина, из-за которой повышение может работать не так, как ожидалось.
Если функция фильтра Bluelight на телефоне включена
я столкнулся с этой проблемой, когда высота оказалась полностью искаженной и невыносимой в моем устройстве. Но высота была в порядке в предварительном просмотре. Отключение фильтра Bluelight на телефоне решило проблему.
Так что даже после установки
android:outlineProvider="bounds"в высота не работает должным образом, то вы можете попробовать возиться с настройками цвета телефона.
Я считаю, что ваша проблема связана с тем, что вы применили элемент elevation к относительному макету, который заполняет его родительский элемент. Его родитель обрезает все дочерние виды в пределах своего собственного холста чертежа (и является видом, который обрабатывает тень ребенка). Вы можете исправить это, применив свойство elevation к самому верхнему
RelativeLayoutв вашем представлении xml (корневой тег).
в моем случае шрифты были проблемой.
1) Без
fontFamilyмне нужно установитьandroid:backgroundкакое-то значение.<TextView android:layout_width="match_parent" android:layout_height="44dp" android:background="@android:color/white" android:elevation="3dp" android:gravity="center" android:text="@string/fr_etalons_your_tickets" android:textAllCaps="true" android:textColor="@color/blue_4" />2) с
fontFamilyмне пришлось добавитьandroid:outlineProvider="bounds"установка:<TextView android:fontFamily="@font/gilroy_bold" android:layout_width="match_parent" android:layout_height="44dp" android:background="@android:color/white" android:elevation="3dp" android:gravity="center" android:outlineProvider="bounds" android:text="@string/fr_etalons_your_tickets" android:textAllCaps="true" android:textColor="@color/blue_4" />
Comments