Teresa
Teresa

Reputation: 1

Animate ImageView on button clicked

I'm trying to translate an ImageView, moving it downward one step at a time with each click. However, the animation only works for the first button click; all subsequent clicks only change the ImageView's location without the animation.

Here is my move_down.xml file:

<?xml version="1.0" encoding="utf-8"?>
<translate 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromYDelta="0%"
    android:toYDelta="100%"
    android:duration="500"
/>

Here is my button declaration in my main.xml:

<Button
     android:id="@+id/bGo"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text="Go"
 android:onClick="startAnimation" />

Here is my startAnimation function:

public void startAnimation(View view) {
        Animation test = AnimationUtils.loadAnimation(this, R.anim.move_down);
        character.startAnimation(test);//This is the ImageView I'm trying to animate
        test.setAnimationListener(new AnimationListener() {
            public void onAnimationStart(Animation animation) {}
            public void onAnimationRepeat(Animation animation) {}
            public void onAnimationEnd(Animation animation) {
                character.setY(character.getY() + character.getHeight());          
                }
        });     
}

When I commented out the line

character.setY(character.getY() + character.getHeight());

The animation would work but the location of the ImageView would snap back after the animation was finished.

Upvotes: 0

Views: 1492

Answers (2)

Ilan Kutsman
Ilan Kutsman

Reputation: 469

Maybe you should try something like this

public void startAnimation(View view) 
{
    Animation test = AnimationUtils.loadAnimation(this, R.anim.move_down);
    character.startAnimation(test);
    character.setVisibility(View.GONE);//when returns to original position, make it invisible
    character.setY(character.getY() + character.getHeight());//move to new location
    character.setVisibility(View.VISIBLE);//make it visible
}

After animation ends, it returns to the original location, so you need to make it invisible and then move it to the new location where it moved to in the animation and then make it visible. When running, it should appear seamless.

Upvotes: 0

FoamyGuy
FoamyGuy

Reputation: 46856

take out

character.setY(character.getY() + character.getHeight());

Use the fillAfter attribute of the Animation to make it stay where it is at when the animation ends.

Like this:

Animation test = AnimationUtils.loadAnimation(this, R.anim.move_down);
test.setFillAfter(true);

Upvotes: 1

Related Questions