Disons que j'ai une mise en page linéaire verticale avec:
[v1]
[v2]
Par défaut, v1 a visibily = GONE. Je voudrais montrer la v1 avec une animation développée et pousser la v2 en même temps.
J'ai essayé quelque chose comme ça:
Animation a = new Animation()
{
int initialHeight;
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
final int newHeight = (int)(initialHeight * interpolatedTime);
v.getLayoutParams().height = newHeight;
v.requestLayout();
}
@Override
public void initialize(int width, int height, int parentWidth, int parentHeight) {
super.initialize(width, height, parentWidth, parentHeight);
initialHeight = height;
}
@Override
public boolean willChangeBounds() {
return true;
}
};
Mais avec cette solution, j'ai un clin d'œil lorsque l'animation démarre. Je pense que cela est dû à l'affichage de la v1 en taille réelle avant l'application de l'animation.
Avec javascript, c'est une ligne de jQuery! Une façon simple de le faire avec Android?
a.setDuration(((int)(initialHeight / v.getContext().getResources().getDisplayMetrics().density)) * 4)
v.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
etv.getLayoutParams().height = interpolatedTime == 1 ? targetHeight : (int)(targetHeight * interpolatedTime);
cela a fonctionné pour moi!J'essayais de faire ce que je pense être une animation très similaire et j'ai trouvé une solution élégante. Ce code suppose que vous allez toujours de 0-> h ou h-> 0 (h étant la hauteur maximale). Les trois paramètres du constructeur sont view = la vue à animer (dans mon cas, une webview), targetHeight = la hauteur maximale de la vue, et down = un booléen qui spécifie la direction (true = expand, false = collapsing).
la source
Je suis tombé sur le même problème aujourd'hui et je suppose que la vraie solution à cette question est la suivante
Vous devrez définir cette propriété pour toutes les dispositions les plus hautes, qui sont impliquées dans le décalage. Si vous définissez maintenant la visibilité d'une mise en page sur GONE, l'autre occupera l'espace pendant que la disparition disparaît. Il y aura une animation par défaut qui est une sorte de "disparition progressive", mais je pense que vous pouvez changer cela - mais la dernière que je n'ai pas testée, pour l'instant.
la source
J'ai pris la solution de @LenaYan qui ne fonctionnait pas correctement pour moi ( car elle transformait la vue en une vue de hauteur 0 avant de réduire et / ou de développer ) et j'ai apporté quelques modifications.
Maintenant, cela fonctionne très bien , en prenant la hauteur précédente de la vue et en commençant à agrandir avec cette taille. L'effondrement est le même.
Vous pouvez simplement copier et coller le code ci-dessous:
Usage:
Assez facile!
Merci LenaYan pour le code initial!
la source
Une alternative consiste à utiliser une animation d'échelle avec les facteurs d'échelle suivants pour l'expansion:
et pour l'effondrement:
la source
La réponse de @Tom Esterez , mais mise à jour pour utiliser correctement view.measure () par Android getMeasuredHeight renvoie des valeurs erronées!
la source
Ok, je viens de trouver une solution TRÈS moche:
N'hésitez pas à proposer une meilleure solution!
la source
View.onMeause(widthMeasureSpec, heightMeasureSpec)
invocation, donc les spécifications de largeur et de hauteur doivent être échangées.la source
Si vous ne voulez pas agrandir ou réduire complètement - voici une simple HeightAnimation -
Usage:
la source
J'ai adapté la réponse actuellement acceptée par Tom Esterez , qui fonctionnait mais avait une animation saccadée et pas très fluide. Ma solution remplace essentiellement le
Animation
par unValueAnimator
, qui peut être équipé d'unInterpolator
de votre choix pour obtenir divers effets tels que dépassement, rebond, accélération, etc.Cette solution fonctionne très bien avec les vues qui ont une hauteur dynamique (c'est-à-dire en utilisant
WRAP_CONTENT
), car elle mesure d'abord la hauteur réelle requise puis s'anime à cette hauteur.Vous appelez alors simplement
expand( myView );
oucollapse( myView );
.la source
v.measure()
et maintenant cela fonctionne parfaitement. Merci!En utilisant les fonctions d'extension de Kotlin, ceci est testé et la réponse la plus courte
Il suffit d'appeler animateVisibility (développer / réduire) sur n'importe quelle vue.
la source
En ajoutant à l' excellente réponse de Tom Esterez et à l' excellente mise à jour d' Erik B , j'ai pensé publier ma propre prise de vue, en compactant les méthodes d'extension et de contrat en une seule. De cette façon, vous pourriez par exemple avoir une action comme celle-ci ...
... qui appelle la méthode ci-dessous et lui permet de savoir quoi faire après chaque onClick () ...
la source
Je voudrais ajouter quelque chose à la réponse très utile ci-dessus . Si vous ne connaissez pas la hauteur avec laquelle vous vous retrouverez, car votre vue .getHeight () renvoie 0, vous pouvez effectuer les opérations suivantes pour obtenir la hauteur:
Où DUMMY_HIGH_DIMENSIONS est la largeur / hauteur (en pixels) à laquelle votre vue est contrainte ... avoir un nombre énorme est raisonnable lorsque la vue est encapsulée avec un ScrollView.
la source
Il s'agit d'un extrait que j'ai utilisé pour redimensionner la largeur d'une vue (LinearLayout) avec animation.
Le code est censé se développer ou se réduire en fonction de la taille cible. Si vous voulez une largeur fill_parent, vous devrez passer le parent .getMeasuredWidth comme largeur cible tout en définissant le drapeau sur true.
J'espère que cela aide certains d'entre vous.
}
la source
resizeAnim.start()
. Ont également essayé avec et sanssetFillAfter(true)
.startAnimation(resizeAnim)
à la vue.Pour une animation fluide, veuillez utiliser le gestionnaire avec la méthode d'exécution ..... Et profitez de l'animation Développer / Réduire
Et appelez en utilisant ce code:
Une autre solution est:
la source
solutions combinées de @Tom Esterez et @Geraldo Neto
la source
Oui, je suis d'accord avec les commentaires ci-dessus. Et en effet, il semble que la bonne chose (ou du moins la plus simple?) À faire est de spécifier (en XML) une hauteur de mise en page initiale de "0px" - et ensuite vous pouvez passer un autre argument pour "toHeight" ( c'est-à-dire la "hauteur finale") pour le constructeur de votre sous-classe d'animation personnalisée, par exemple dans l'exemple ci-dessus, cela ressemblerait à ceci:
En tout cas, j'espère que ça aide! :)
la source
Voici ma solution. Je pense que c'est plus simple. Il élargit seulement la vue mais peut facilement être étendu.
la source
Je pense que la solution la plus simple consiste à définir
android:animateLayoutChanges="true"
votre vueLinearLayout
, puis à afficher / masquer la vue en définissant sa visibilité. Fonctionne comme un charme, mais vous n'avez aucun contrôle sur la durée de l'animationla source
Tu es sur la bonne piste. Assurez-vous que la v1 est définie pour avoir une hauteur de mise en page de zéro juste avant le début de l'animation. Vous souhaitez initialiser votre configuration pour qu'elle ressemble à la première image de l'animation avant de démarrer l'animation.
la source
Ce fut ma solution, mon
ImageView
passe de100%
à200%
et revient à sa taille d'origine, en utilisant deux fichiers d'animation à l'intérieur dures/anim/
dossieranim_grow.xml
anim_shrink.xml
Envoyer un
ImageView
à ma méthodesetAnimationGrowShrink()
setAnimationGrowShrink()
méthode:la source
C'est une bonne solution de travail, je l'ai testée:
Exapnd:
Effondrer:
Animateur de valeur:
La vue v est la vue à animer, PARENT_VIEW est la vue conteneur contenant la vue.
la source
C'est vraiment simple avec droidQuery . Pour commencer, considérez cette disposition:
Nous pouvons animer la hauteur à la valeur souhaitée - disons
100dp
- en utilisant le code suivant:Utilisez ensuite
droidQuery
pour animer. La manière la plus simple est avec ceci:Pour rendre l'animation plus attrayante, pensez à ajouter un assouplissement:
Vous pouvez également modifier la durée d'
AnimationOptions
utilisation de laduration()
méthode ou gérer ce qui se passe à la fin de l'animation. Pour un exemple complexe, essayez:la source
Meilleure solution pour développer / réduire les vues:
la source
onCheckedChanged
.Vous pouvez utiliser un ViewPropertyAnimator avec une légère torsion. Pour réduire, redimensionnez la vue à une hauteur de 1 pixel, puis masquez-la. Pour l'agrandir, l'afficher, puis l'agrandir à sa hauteur.
Le pivot indique à la vue à partir de quelle échelle, la valeur par défaut est au milieu. La durée est facultative (par défaut = 1000). Vous pouvez également définir l'interpolateur à utiliser, comme
.setInterpolator(new AccelerateDecelerateInterpolator())
la source
J'ai créé une version dans laquelle vous n'avez pas besoin de spécifier la hauteur de la mise en page, c'est donc beaucoup plus facile et plus propre à utiliser. La solution est d'obtenir la hauteur dans la première image de l'animation (elle est disponible à ce moment, du moins lors de mes tests). De cette façon, vous pouvez fournir une vue avec une hauteur et une marge inférieure arbitraires.
Il y a aussi un petit piratage dans le constructeur - la marge inférieure est définie sur -10000 afin que la vue reste cachée avant la transformation (empêche le scintillement).
la source
Utilisez ValueAnimator:
la source
mainView.getLayoutParams().height = height
.la source
La classe peut être appelée de la manière suivante
la source
Basé sur les solutions de @Tom Esterez et @Seth Nelson (top 2), je les ai simplifiées. En plus des solutions originales, cela ne dépend pas des options du développeur (paramètres d'animation).
la source