Android: <include> con RippleEffect & StateListAnimator
Tengo un diseño, que incluye otro diseño:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:id="@+id/layout1"> <include layout="@layout/my_layout"/> </LinearLayout>
Necesito agregar un RippleEffect así como un StateListAnimator al diseño incluido.
- Android Button Ripple en Lollipop y resaltar en pre lollipop
- Cómo establecer state_selected en ripple drawable
- Cómo crear efecto de rizo en un diseño sencillo
- NavigationView + selector + efecto de rizo estado seleccionado no funciona
- Efecto de ondulación de material oculto por otra vista en el diseño
Ejemplo:
<include layout="@layout/my_layout" android:stateListAnimator="@anim/lift_up" android:background="@drawable/ripple_effect"/>
Tanto el RippleEffect como el StateListAnimator funcionan al 100%. No puedo alterar el diseño incluido. Por lo tanto, la razón por la que tengo que hacer los efectos en la etiqueta de inclusión o el propio diseño de los padres.
He probado ambas técnicas, ninguna de las cuales ha sido exitosa.
ACTUALIZAR
Si es posible, esto debería estar programado.
ACTUALIZAR 2
En segundo lugar, ¿cómo voy a mantener la vista elevada , una vez que ha animado?
- AppCompatButton backgroundTint API <21
- Mantenga la ondulación dentro del trazo
- RippleDrawable creada programaticamente se ve diferente de su contraparte xml
- El efecto Ripple no aparece a veces
- ¿Cómo manejar el efecto Ripple en 9-patch y CardView, y tener control sobre los estados del selector?
- SetBackgroundResource actúa diferente de setBackground con RippleDrawable
- No se pudo encontrar la clase 'android.graphics.drawable.RippleDrawable' Unicode issue?
- Cómo crear efecto de rizo para pre-lollipop
Necesita encontrar la vista y llamar al método apropiado para cambiar el animador de la lista de estado y el fondo. Es posible que también necesite llamar a setClickable en la vista raíz del diseño incluido.
LinearLayout layout1 = findViewById(R.id.layout1); View root = layout1.getChildAt(0); StateListAnimator sla = AnimatorInflater.loadStateListAnimator(context, R.anim.lift_up); root.setStateListAnimator(sla); root.setBackground(R.drawable.ripple_effect);
Basado en el hilo ¿La etiqueta de Android XML 'include' realmente funciona? Y LayoutInflater.java parece que la etiqueta <include>
solo admite los atributos android:id
, layout_*
y android:visibility
. Así que su código para establecer el background
y stateListAnimator
no tienen ningún efecto.
Para solucionar el siguiente problema con el código de @Stepane :
Su método permite el efecto de ondulación correctamente, sin embargo, el SLA no se dispara. No puedo ver ninguna elevación teniendo lugar
Si la vista inflada es transparente, entonces la elevación no es visible, hay que establecer viewOutline
o usar algún color no transparente para que la vista vea la sombra.
Un extracto de la documentación de ViewOutlineProvider :
Interfaz por la que una vista construye su contorno, utilizado para la proyección de sombras y el recorte.
Para establecer el outlineProvider
puede hacer uso del método View # setOutlineProvider (ViewOutlineProvider provider) o puede establecer a través de android:outlineProvider
xml tag.
Código actualizado:
LinearLayout root =(LinearLayout) findViewById(R.id.container); StateListAnimator sla = AnimatorInflater.loadStateListAnimator(this, R.animator.lift_up); root.setStateListAnimator(sla); root.setClickable(true); root.setOutlineProvider(ViewOutlineProvider.PADDED_BOUNDS); root.setBackground(ContextCompat.getDrawable(this, R.drawable.ripple_effect));
Ripple_effect.xml
<ripple xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:color="?android:colorAccent" tools:ignore="NewApi"> <item> <shape android:shape="rectangle"> <solid android:color="@android:color/transparent"/> <!-- Doesn't require outlineProvider <solid android:color="@android:color/darker_gray"/> --> </shape> </item> </ripple>
Res / animator / lift_up.xml
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_enabled="true" android:state_pressed="true"> <objectAnimator android:duration="@android:integer/config_shortAnimTime" android:propertyName="translationZ" android:valueTo="48dp"/> </item> <item> <objectAnimator android:duration="@android:integer/config_shortAnimTime" android:propertyName="translationZ" android:valueTo="0dp"/> </item> </selector>
- Cómo obtener SMS de borrador en Android 6 Marshmallow
- WebView loadDataWithBaseUrl – problema extraño en android 4.0.3