Je souhaite utiliser ScaleAnimation (pas par programmation en xml) pour modifier la hauteur et afficher de 0 à 60% de la hauteur du parent. La largeur de vue est constante et est 50px. La vue est vide, seule la couleur d'arrière-plan est définie.
Quelqu'un peut-il me donner du code pour scaleAnim
en utilisant ScaleAnimation à partir du code.
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:orientation="vertical"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:id="@+id/layContainer
>
<View
Android:layout_width="50px"
Android:layout_height="fill_parent"
Android:id="@+id/viewContainer"
Android:background:"#00f00"
/>
</LinearLayout>
ScaleAnimation scaleAnim = new ScaleAnimation(...);
voir avant et après l'animation .Merci
Voici un code pour faire exactement cela.
public void scaleView(View v, float startScale, float endScale) {
Animation anim = new ScaleAnimation(
1f, 1f, // Start and end values for the X axis scaling
startScale, endScale, // Start and end values for the Y axis scaling
Animation.RELATIVE_TO_SELF, 0f, // Pivot point of X scaling
Animation.RELATIVE_TO_SELF, 1f); // Pivot point of Y scaling
anim.setFillAfter(true); // Needed to keep the result of the animation
anim.setDuration(1000);
v.startAnimation(anim);
}
Le constructeur ScaleAnimation utilisé ici prend 8 arguments, 4 relatifs à la gestion de l'échelle X dont nous ne nous soucions pas de (1f, 1f, ... Animation.RELATIVE_TO_SELF, 0f, ...)
.
Les 4 autres arguments concernent la mise à l'échelle Y dont nous nous soucions.
startScale, endScale
- Dans votre cas, vous utiliseriez 0f, 0.6f
.
Animation.RELATIVE_TO_SELF, 1f
- Ceci spécifie où la réduction de la vue se réduit (appelée pivot dans la documentation). Ici, nous définissons la valeur float sur 1f
Car nous souhaitons que l'animation commence à augmenter la barre à partir du bas. Si nous voulions qu'il croisse de haut en bas, nous utiliserions 0f
.
Enfin et tout aussi important, l’appel à anim.setFillAfter(true)
. Si vous souhaitez conserver le résultat de l'animation une fois l'animation terminée, vous devez l'exécuter sur l'animateur avant d'exécuter l'animation.
Donc dans votre cas, vous pouvez faire quelque chose comme ceci:
View v = findViewById(R.id.viewContainer);
scaleView(v, 0f, .6f);
essayez ce code pour créer une animation Scale sans utiliser xml
ScaleAnimation animation = new ScaleAnimation(fromXscale, toXscale, fromYscale, toYscale, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
En XML, c’est ce que j’utilise pour obtenir le même résultat. Peut-être c'est plus intuitif.
scale_up.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android" >
<scale
Android:duration="200"
Android:fromXScale="1.0"
Android:fromYScale="0.0"
Android:pivotX="50%"
Android:pivotY="100%"
Android:toXScale="1.0"
Android:toYScale="1.0" />
</set>
scale_down.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:Android="http://schemas.Android.com/apk/res/Android" >
<scale
Android:duration="200"
Android:fromXScale="1.0"
Android:fromYScale="1.0"
Android:pivotX="50%"
Android:pivotY="100%"
Android:toXScale="1.0"
Android:toYScale="0.0" />
</set>
Voir l'animation sur l'axe des X est de 1.0 -> 1.0
ce qui signifie que vous n’avez aucune mise à l’échelle dans cette direction et reste sur toute la largeur tandis que, sur l’axe Y, vous obtenez 0.0 -> 1.0
mise à l'échelle, comme indiqué dans le graphique de la question. J'espère que ça aide quelqu'un.
Certains voudront peut-être connaître le code Java comme on en voit un demandé.
Placez les fichiers d'animation dans le dossier anim
, puis chargez et définissez les fichiers d'animation de la même manière.
Animation scaleDown = AnimationUtils.loadAnimation(youContext, R.anim.scale_down);
ImagView v = findViewById(R.id.your_image_view);
v.startAnimation(scaleDown);
Utilisez cette méthode
Si vous voulez scale au quart (la moitié x, la moitié y)
view.animate().scaleX(0.5f).scaleY(0.5f)
Si vous voulez scale et allez en bas à droite
view.animate().scaleX(0.5f).scaleY(0.5f)
.translationY((view.height/4).toFloat()).translationX((view.width/4).toFloat())
Si vous voulez déplacer vers haut utilisez (-view.height/4)
Et pour gauche (-view.width/4)
Si vous voulez faire quelque chose après l'animation utilisez withEndAction(Runnable runnable)
fonction.
Vous pouvez utiliser une autre propriété comme alpha et rotation
code complet
view.animate()
.scaleX(0.5f).scaleY(0.5f)//scale to quarter(half x,half y)
.translationY((view.height/4).toFloat()).translationX((view.width/4).toFloat())// move to bottom / right
.alpha(0.5f) // make it less visible
.rotation(360f) // one round turns
.setDuration(1000) // all take 1 seconds
.withEndAction(new Runnable() {
@Override
public void run() {
//animation ended
}
});
Redimensionnez en utilisant méthodes d'assistance et gestionnaires de début-répétition-fin comme ceci:
resize(
view1,
1.0f,
0.0f,
1.0f,
0.0f,
0.0f,
0.0f,
150,
null,
null,
null);
return null;
}
Méthodes d'assistance:
/**
* Resize a view.
*/
public static void resize(
View view,
float fromX,
float toX,
float fromY,
float toY,
float pivotX,
float pivotY,
int duration) {
resize(
view,
fromX,
toX,
fromY,
toY,
pivotX,
pivotY,
duration,
null,
null,
null);
}
/**
* Resize a view with handlers.
*
* @param view A view to resize.
* @param fromX X scale at start.
* @param toX X scale at end.
* @param fromY Y scale at start.
* @param toY Y scale at end.
* @param pivotX Rotate angle at start.
* @param pivotY Rotate angle at end.
* @param duration Animation duration.
* @param start Actions on animation start. Otherwise NULL.
* @param repeat Actions on animation repeat. Otherwise NULL.
* @param end Actions on animation end. Otherwise NULL.
*/
public static void resize(
View view,
float fromX,
float toX,
float fromY,
float toY,
float pivotX,
float pivotY,
int duration,
Callable start,
Callable repeat,
Callable end) {
Animation animation;
animation =
new ScaleAnimation(
fromX,
toX,
fromY,
toY,
Animation.RELATIVE_TO_SELF,
pivotX,
Animation.RELATIVE_TO_SELF,
pivotY);
animation.setDuration(
duration);
animation.setInterpolator(
new AccelerateDecelerateInterpolator());
animation.setFillAfter(true);
view.startAnimation(
animation);
animation.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
if (start != null) {
try {
start.call();
} catch (Exception e) {
e.printStackTrace();
}
}
}
@Override
public void onAnimationEnd(Animation animation) {
if (end != null) {
try {
end.call();
} catch (Exception e) {
e.printStackTrace();
}
}
}
@Override
public void onAnimationRepeat(
Animation animation) {
if (repeat != null) {
try {
repeat.call();
} catch (Exception e) {
e.printStackTrace();
}
}
}
});
}
public void expand(final View v) {
ScaleAnimation scaleAnimation = new ScaleAnimation(1, 1, 1, 0, 0, 0);
scaleAnimation.setDuration(250);
scaleAnimation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
v.setVisibility(View.INVISIBLE);
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
v.startAnimation(scaleAnimation);
}
public void collapse(final View v) {
ScaleAnimation scaleAnimation = new ScaleAnimation(1, 1, 0, 1, 0, 0);
scaleAnimation.setDuration(250);
scaleAnimation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
v.setVisibility(View.VISIBLE);
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
v.startAnimation(scaleAnimation);
}