Bonjour à tous,

Je viens vers vous pour un problème que je comprend mais que je ne m'explique pas (j'ai trouvé une solution pour contourner la problématique mais elle ne me plaît pas pour être honnête).

J'essaie donc de créer une animation pour grossir un objet de type "View". J'effectue un calcul pour déterminer le ratio du grossissement à effectuer et je l'applique donc via un objet "ObjetAnimator".

Je vous met le code qui pose problème ci dessous :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public void impact(JutsuRenderer renderer)
    {
        mFire -= (renderer.getWater() + renderer.getWaterDefense());
        mWater -= renderer.getFire();
 
        float ratio = (((float)mWater + (float)renderer.mWaterDefense) / (float) mWater);
        //amplification of power
        if (mWater > 0)
        {
 
            ObjectAnimator growX = ObjectAnimator.ofFloat(mAssociateView, "scaleX", mAssociateView.getScaleX(), ratio * mAssociateView.getScaleX());
            ObjectAnimator growY = ObjectAnimator.ofFloat(mAssociateView, "scaleY", mAssociateView.getScaleY(), ratio * mAssociateView.getScaleY());
 
            AnimatorSet growing = new AnimatorSet();
            growing.playTogether(growX, growY);
            growing.setDuration(100);
            growing.start();
 
 
            mWater = mWater + renderer.mWaterDefense;
        }
 
        if (mFire < 0) mFire = 0;
        if (mWater < 0) mWater = 0;
    }
Ce que je ne comprend pas c'est que la variable "ratio" à l'air d'être interpréter au moment de l'animation. En effet au moment de l'animation, visiblement ce n'est pas la variable "ratio" qui est prise en compte mais le résultat du calcul (avec la valeur de mWater modifiée donc) à savoir :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
((float)mWater + (float)renderer.mWaterDefense) / (float) mWater)
Ce qui fait que mon animation ne fonctionne pas ...

Mais si je commente cette ligne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
mWater = mWater + renderer.mWaterDefense;
Cela fonctionne ... J'ai l'impression que mon calcul est fait avant l'animation et que lors de l'affection à la variable "ratio" la valeur de mWater correspond à la nouvelle valeur calculée ensuite.

Pour palier au problème j'ai du faire cela :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public void impact(final JutsuRenderer renderer)
    {
        mFire -= (renderer.getWater() + renderer.getWaterDefense());
        mWater -= renderer.getFire();
 
        //amplification of power
        if (mWater > 0)
        {
            final float ratio = (((float)mWater + (float)renderer.mWaterDefense) / (float) mWater);
 
            ObjectAnimator growX = ObjectAnimator.ofFloat(mAssociateView, "scaleX", mAssociateView.getScaleX(), ratio * mAssociateView.getScaleX());
            ObjectAnimator growY = ObjectAnimator.ofFloat(mAssociateView, "scaleY", mAssociateView.getScaleY(), ratio * mAssociateView.getScaleY());
 
            AnimatorSet growing = new AnimatorSet();
            growing.playTogether(growX, growY);
            growing.setDuration(100);
            growing.start();
 
            new Handler().postDelayed(new Runnable()
            {
                @Override
                public void run()
                {
                    mWater = mWater + renderer.mWaterDefense;
                }
            }, 150);
        }
 
        if (mFire < 0) mFire = 0;
        if (mWater < 0) mWater = 0;
    }
En gros modifier la variable "mWater" après l'animation. Voilà je suis nouveau sur android, mais j'avoue ne pas trop comprendre ce fonctionnement (de plus il me semblait que les types primitifs en java fonctionnaient par copie ce qui me rend encore plus perplexe sur le fonctionnement du langage).

J'ai aussi essayer de mettre le calcul dans l’événement onAnimationEnd() mais même résultat.

Je remercie d'avance les personnes qui prendront le temps de me répondre.