Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Android 5.0 android: elevación Funciona para la vista, pero no el botón?

En las muestras de Android 5.0 del SDK Manager, está el ejemplo de ElevationBasic . Muestra dos objetos View : un círculo y un cuadrado. El círculo tiene android:elevation establecida en 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> 

En un Nexus 9, ejecutando la muestra tal cual, obtendremos una sombra en el círculo:

ElevationBasic, según lo escrito originalmente

Si cambiamos la clase de widget a Button , dejando todos los demás atributos tal cual, perdemos la sombra de caída en el círculo:

ElevationBasic, usando un botón

Las preguntas:

  1. ¿Por qué cambia el comportamiento de la android:elevation ? No puede ser debido al fondo, porque es el mismo fondo en ambos casos.

  2. ¿Qué clases soportan android:elevation , y cuáles no? Por ejemplo, usar TextView lugar de View o Button todavía nos da la sombra, por lo que este cambio de comportamiento no se introduce en el nivel de TextView , sino en el nivel de Button .

  3. Como se ve en esta pregunta de ayer, ¿cómo conseguimos el android:elevation para ser honrada en un Button ? ¿Hay algún android:allowElevationToWorkAsDocumented="true" valor que tenemos que poner en un tema o algo así?

4 Solutions collect form web for “Android 5.0 android: elevación Funciona para la vista, pero no el botón?”

El estilo de botón predeterminado en Material tiene un StateListAnimator que controla las propiedades android:elevation y android:translationZ . Puede quitar el animador existente o establecer su propio uso de la propiedad android:stateListAnimator .

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

El animador predeterminado se define en button_state_list_anim_material.xml . Aquí hay un ejemplo que muestra los estados activados y presionados:

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

En mi experiencia con Appcompat v7 que se ejecuta en el dispositivo Lollipop, Button trabaja con funciones predeterminadas como efecto ripple, elevación y animación z en clic, pero las echa de menos si se establece una propiedad personalizada android:background (como color o selector) en el elemento xml.

Esto se debe a que está configurando el fondo del botón manualmente que reemplazará todos sus efectos.

A partir de la versión 23.0.0 de AppCompat , hay un nuevo estilo Widget.AppCompat.Button.Colored que utiliza el colorButtonNormal de su tema para el color desactivado y colorAccent para el color habilitado.

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

Si desea diferentes colores que los especificados, puede crear un nuevo tema y aplicarlo al botón a través de android:theme . Entonces usted puede utilizar este tema en todos sus botones donde usted quiere el mismo efecto.

Tuve un problema similar que pensé que se debía a diseños incorrectamente inflados, pero parecía que la adición de clipToPadding hizo el truco. Debe establecerse en el ViewGroup padre que contiene la vista que desea ViewGroup una sombra.

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

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.