2016-01-08 1 views
13

J'ai une mise en page, qui comprend une autre mise en page:Android: <include> avec RippleEffect & StateListAnimator

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

Je dois ajouter un RippleEffect ainsi qu'un StateListAnimator à la mise en page inclus.

Exemple:

<include layout="@layout/my_layout" 
      android:stateListAnimator="@anim/lift_up" 
      android:background="@drawable/ripple_effect"/> 

Les deux RippleEffect et StateListAnimator travaillent à 100%. Je ne peux pas modifier la disposition incluse. Ainsi, la raison pour laquelle je dois faire les effets soit sur la balise include ou la mise en page parente elle-même.

J'ai essayé les deux techniques, dont aucune n'a été couronnée de succès.

MISE À JOUR

Si possible, cela devrait être en baisse par programme.

MISE A JOUR 2

En second lieu, how would I go about keep the View elevated, une fois qu'il a animé?

Répondre

2

Vous devez trouver la vue et appeler la méthode appropriée pour modifier l'animateur de liste d'états et l'arrière-plan. Vous devrez peut-être également appeler setClickable dans la vue racine de la mise en page incluse.

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); 
+0

Cela semble assez légitime. J'ai mis à jour la question avec un autre aspect basé sur le SLA. – TejjD

+2

Vous modifiez est une question différente. Vous devriez en ouvrir un autre avec ce problème spécifique. –

+0

Cool. Avec la question actuelle, votre méthode permet l'effet d'entraînement correctement, mais le SLA n'est pas déclenché. Je ne vois aucune élévation – TejjD

2

Basé sur le fil Does Android XML Layout's 'include' Tag Really Work? et LayoutInflater.java il semble balise <include> ne supporte que android:id, layout_* et android:visibility attributs. Donc, votre code pour définir background et stateListAnimator n'a aucun effet.

Pour résoudre le problème ci-dessous avec le code de @Stepane:

votre méthode permet à l'effet d'entraînement correctement, mais la SLA ne tiré. Je ne vois aucune élévation qui aura lieu

Si la vue est gonflé transparent, l'élévation est pas visible, vous devez définir viewOutline ou utiliser une couleur non transparente pour la vue de voir l'ombre.

Un extrait de ViewOutlineProviderdocumentation:

Interface par laquelle un View construit son contour, utilisé pour des ombres portées et la coupure.

Pour définir la outlineProvider vous pouvez utiliser View#setOutlineProvider (ViewOutlineProvider provider) méthode ou vous pouvez définir via android:outlineProvider balise xml.

code Mise à jour:

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/animateur/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> 
+0

Merci pour l'explication, mais ça ne marche toujours pas. Je pense que le problème est que la balise include correspond à la largeur du parent, donc l'élévation réelle n'est pas visible. J'ai essayé votre méthode de toutes les manières possibles. En vain – TejjD

+0

@TejjD J'ai essayé d'utiliser match_parent pour la hauteur et la largeur, tout fonctionne bien. J'ai mis à jour le message pour inclure le code 'lift_up.xml' (élévation) pour plus de clarté, vérifiez-le. Juste curieux, quel appareil et la version Android utilisez-vous pour le test? – blizzard

+0

C'est le code exact que j'utilise aussi. Je teste sur un Nexus 6P, en cours d'exécution Marshmallow – TejjD