Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android translate animation - permanently move View to new position using AnimationListener

I have android translate Animation. I have an ImageView with random generated position (next1, next2). I am calling void every 3 seconds. It generates new position of the View and then make animation and move View to destination position. Translate animation has AnimationListener implemented. When the animation finish, I move View permanently to the new position (in OnAnimationEnd). My problem is that animation position does not correspond with setting layoutParams positions. When animation end, it makes jump to a new position, which is about 50-100 pixels far. I think the positions should be the same because I use same values (next1, next2) in both situations. Please can you show me the way to find sollution ? 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); 

Here is XML layout:

<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> 
like image 368
mira Avatar asked Sep 25 '13 23:09

mira


People also ask

Can be used to animate between two or more views?

In Android, ViewAnimator is a sub class of FrameLayout container that is used for switching between views. It is an element of transition widget which helps us to add transitions on the views ( like TextView, ImageView or any layout). It is mainly useful to animate the views on screen.

Which library could be used to do animation effects on views?

RecyclerView Animators is an Android library that allows developers to easily create RecyclerView with animations.

What is translate animation in Android?

Translate Animation can change the visual appearance of an object, but they cannot change the objects themselves. That is, if you apply a translate animation to a view, it would move to a new position, but its click events would not get fired; the click events would still get fired at its previous position.


2 Answers

I usually prefer to work with deltas in translate animation, since it avoids a lot of confusion.

Try this out, see if it works for you:

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); 

Make sure to make amountToMoveRight / amountToMoveDown final

Hope this helps :)

like image 199
Gil Moshayof Avatar answered Sep 27 '22 23:09

Gil Moshayof


You should rather use ViewPropertyAnimator. This animates the view to its future position and you don't need to force any layout params on the view after the animation ends. And it's rather simple.

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

Note: This pixel is not relative to the view. This pixel is the pixel position in the screen.

like image 40
bpr10 Avatar answered Sep 27 '22 23:09

bpr10