web-dev-qa-db-fra.com

Animation de traduction Android: déplacez en permanence la vue vers un nouveau poste à l'aide d'AnimationListener

J'ai Android traduire Animation. J'ai un ImageView avec la position générée au hasard (next1, next2). J'appelle vide toutes les 3 secondes. Il génère une nouvelle position de la vue, puis crée une animation et déplace la vue vers la position de destination. Traduire l'animation a AnimationListener implémenté. Lorsque l'animation est terminée, je déplace View de manière permanente vers le nouvel emplacement (dans OnAnimationEnd). Mon problème est que la position de l'animation ne correspond pas à la définition des positions de layoutParams. Lorsque l’animation est terminée, elle fait un saut vers une nouvelle position, distante d’environ 50 à 100 pixels. Je pense que les positions devraient être les mêmes car j'utilise les mêmes valeurs (next1, next2) dans les deux situations. S'il vous plaît pouvez-vous me montrer le moyen de trouver une solution? Drawing of situation here here

 FrameLayout.LayoutParams pozice_motyl = (FrameLayout.LayoutParams)  pozadi_motyl.getLayoutParams();    
            TranslateAnimation anim = new TranslateAnimation(Animation.ABSOLUTE,pozice_motyl.leftMargin, Animation.ABSOLUTE, next1, Animation.ABSOLUTE, pozice_motyl.topMargin, Animation.ABSOLUTE, next2);
            anim.setDuration(1000);
            anim.setFillAfter(true);
            anim.setFillEnabled(true);

            anim.setAnimationListener(new Animation.AnimationListener() {
                @Override
                public void onAnimationStart(Animation animation) {
                }

                @Override
                public void onAnimationEnd(Animation animation) {




                    FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(100, 100);

                    layoutParams.leftMargin = (int)(next1);
                    layoutParams.topMargin = (int)(next2);
                    pozadi_motyl.setLayoutParams(layoutParams);

                }

                @Override
                public void onAnimationRepeat(Animation animation) {

                }
            });

            pozadi_motyl.startAnimation(anim);

Voici la mise en page XML:

<FrameLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    xmlns:ads="http://schemas.Android.com/apk/lib/com.google.ads"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent" 
    Android:id="@+id/pozadi0"
    Android:gravity="center_vertical"
    Android:layout_gravity="center_vertical"          
    Android:background="@drawable/pozadi2"
    >



<LinearLayout
Android:id="@+id/pozadi_motyl"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        >

  <ImageView Android:id="@+id/obrazek_motyl"
             Android:src="@drawable/motyl"
             Android:layout_width="100dip"
             Android:layout_height="100dip"
                         />

   </LinearLayout>


<LinearLayout 
Android:orientation="vertical"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
>

<RelativeLayout
Android:id="@+id/obrazek_pozadi0"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
>



 <ImageView Android:id="@+id/zaba_obrazek0"
Android:src="@drawable/zaba_obrazek"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignParentBottom="true"
Android:layout_centerInParent="true"
/>

</RelativeLayout>   
</LinearLayout> 

<LinearLayout
Android:layout_width="fill_parent"
Android:layout_height="fill_parent" 
>

<cz.zaba.Spojnice  
Android:layout_width="fill_parent"          
Android:layout_height="fill_parent" 
/>

</LinearLayout>
</FrameLayout>
31
mira

Je préfère généralement travailler avec les deltas dans une animation de traduction, car cela évite beaucoup de confusion.

Essayez ceci, voyez si cela fonctionne pour vous:

TranslateAnimation anim = new TranslateAnimation(0, amountToMoveRight, 0, amountToMoveDown);
anim.setDuration(1000);

anim.setAnimationListener(new TranslateAnimation.AnimationListener() {

    @Override
    public void onAnimationStart(Animation animation) { }

    @Override
    public void onAnimationRepeat(Animation animation) { }

    @Override
    public void onAnimationEnd(Animation animation) 
    {
        FrameLayout.LayoutParams params = (FrameLayout.LayoutParams)view.getLayoutParams();
        params.topMargin += amountToMoveDown;
        params.leftMargin += amountToMoveRight;
        view.setLayoutParams(params);
    }
});

view.startAnimation(anim);

Assurez-vous de faire amountToMoveRight/amountToMoveDownfinal

J'espère que cela t'aides :)

48
Gil Moshayof

Vous devriez plutôt utiliser ViewPropertyAnimator . Cela anime la vue dans sa position future et vous n'avez pas besoin de forcer les paramètres de disposition sur la vue une fois l'animation terminée. Et c'est plutôt simple.

myView.animate().x(50f).y(100f);

myView.animate().translateX(pixelInScreen) 

Remarque: Ce pixel n'est pas relatif à la vue. Ce pixel est le pixel position à l'écran.

33
bpr10

tu peux juste faire comme

myView.animate().y(0f);//to move to the top of the screen.
8
Rushi Ayyappa

C'est ce qui a parfaitement fonctionné pour moi: -

// slide the view from its current position to below itself
public void slideUp(final View view, final View llDomestic){

    ObjectAnimator animation = ObjectAnimator.ofFloat(view, "translationY",0f);
    animation.setDuration(100);
    llDomestic.setVisibility(View.GONE);
    animation.start();

}

// slide the view from below itself to the current position
public void slideDown(View view,View llDomestic){
    llDomestic.setVisibility(View.VISIBLE);
    ObjectAnimator animation = ObjectAnimator.ofFloat(view, "translationY",   0f);
    animation.setDuration(100);
    animation.start();
}

llDomestic: La vue que vous souhaitez masquer ..__ vue: La vue que vous souhaitez déplacer vers le bas ou le haut.

0
Debasish Ghosh