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>


однако, вот как это показано элемент списка, без тени:

enter image description here



Я также пробовал следующие безуспешно:




  1. установите высоту для ImageView и TextViews сами вместо родительского макета.

  2. применил фон к ImageView.

  3. используется TranslationZ вместо высоты.

665   16  

16 ответов:

я немного поиграл с тенями на леденце, и вот что я нашел:

  1. похоже, что родитель ViewGroupграницы отсекают тень своих детей по какой-то причине; и
  2. тени набор с android:elevation отрезаны от Viewграницы, а не границы, проходящие через поле;
  3. правильный способ получить дочерний вид, чтобы показать тень, чтобы установить отступ на родителя и установить android:clipToPadding="false" на что родитель.

вот мое предложение вам на основе того, что я знаю:

  1. Установите свой верхний уровень RelativeLayout чтобы отступы были равны полям, которые вы установили на относительном макете, который вы хотите показать тень;
  2. set android:clipToPadding="false" в той же RelativeLayout;
  3. удалите поля из RelativeLayout который также имеет Набор высот;
  4. [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" />

Мне повезло с настройкой clipChildren="false" на родительском макете.

Я провел некоторое время, работая над этим и, наконец, понял, что когда фон темный, тень не видна

Comments

    Ничего не найдено.