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?
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>
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
/amountToMoveDown
final
J'espère que cela t'aides :)
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.
tu peux juste faire comme
myView.animate().y(0f);//to move to the top of the screen.
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.