Android 5.0 android: высота работает для просмотра, но не кнопка?


в образцах Android 5.0 из диспетчера SDK есть ElevationBasic образец. Он показывает два View объекты: круг и Квадрат. Круг имеет android:elevation значение 30dp:

<?xml version="1.0" encoding="utf-8"?>
<!--
 Copyright 2014 The Android Open Source Project

 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
 You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
-->

<FrameLayout 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">
    <View
            android:id="@+id/floating_shape"
            android:layout_width="80dp"
            android:layout_height="80dp"
            android:layout_marginRight="40dp"
            android:background="@drawable/shape"
            android:elevation="30dp"
            android:layout_gravity="center"/>
    <View
            android:id="@+id/floating_shape_2"
            android:layout_width="80dp"
            android:layout_height="80dp"
            android:layout_marginLeft="25dp"
            android:background="@drawable/shape2"
            android:layout_gravity="center"/>
</FrameLayout>

на Nexus 9, запустив образец как есть, мы получаем тень на круге:

если мы изменим класс виджета Button, оставляя все остальные атрибуты как есть, мы теряем тень на круге:

в вопросы:

  1. почему android:elevation поведение меняется? Это не может быть связано с фоном, потому что это один и тот же фон в обоих случаях.

  2. какие классы поддержки android:elevation, а какие нет? Например, с помощью TextView вместо View или Button все еще дает нам тень падения, поэтому это изменение в поведении не вводится в

5 61

5 ответов:

стиль кнопки по умолчанию материал имеет StateListAnimator управления android:elevation и android:translationZ свойства. Вы можете удалить существующий аниматор или установить свой собственный с помощью android:stateListAnimator собственность.

<Button
    ...
    android:stateListAnimator="@null" />

<Button
    ...
    android:stateListAnimator="@anim/my_animator" />

аниматор по умолчанию определяется в button_state_list_anim_material.xml. Вот пример, показывающий включенные и нажатые состояния:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:state_enabled="true">
        <set>
            <objectAnimator android:propertyName="translationZ"
                            android:duration="@integer/button_pressed_animation_duration"
                            android:valueTo="@dimen/button_pressed_z_material"
                            android:valueType="floatType"/>
            <objectAnimator android:propertyName="elevation"
                            android:duration="0"
                            android:valueTo="@dimen/button_elevation_material"
                            android:valueType="floatType"/>
        </set>
    </item>
    <!-- base state -->
    <item android:state_enabled="true">
        <set>
            <objectAnimator android:propertyName="translationZ"
                            android:duration="@integer/button_pressed_animation_duration"
                            android:valueTo="0"
                            android:startDelay="@integer/button_pressed_animation_delay"
                            android:valueType="floatType"/>
            <objectAnimator android:propertyName="elevation"
                            android:duration="0"
                            android:valueTo="@dimen/button_elevation_material"
                            android:valueType="floatType" />
        </set>
    </item>
    ...
</selector>

по моему опыту с Appcompat v7 работает на устройстве Lollipop,Button работает с функциями по умолчанию, такими как эффект пульсации, высота и Z-анимация при щелчке, но пропускает их, если установлен персонализированный android:background свойство (как цвет или селектор) в xml-элементе.

Это потому, что вы устанавливаете фон кнопки вручную, который заменит все его эффекты.

начиная с версии 23.0.0 релиз AppCompat, есть новый виджет.Совместимости приложений.Кнопка.Цветные стиль, который использует colorButtonNormal вашей темы для отключенного цвета и colorAccent для включенного цвета.

    <Button
  ...
  style="@style/Widget.AppCompat.Button.Colored" />

Если вы хотите разные цвета, чем указано, Вы можете создать новую тему и применить ее к кнопке через android:theme. Затем вы можете использовать эту тему на всех ваших кнопок, где вы хотите тот же эффект.

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

... android:clipToPadding="false" ...

Это решение работает для всех версий API Android

создать тень @android:drawable/dialog_holo_light_frame & Если вы хотите настроить цвет фона вместо белого затем создайте слой-фон с настраиваемым цветом поверх тени, как показано ниже

создайте отдельный рисуемый файл white_background_shadow.xml

<?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>

и использовать этот drawable в качестве фона, как это

android:background="@drawable/shadow"