I'm trying to move button (with animation) upon click. I want it to move 100 pixels to the bottom on first click, 100 pixels up on second, 100 pixels to the bottom on third and so on. I have simple layout file (main.xml):
<?xml version="1.0" encoding="utf-8"?>
<Button xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Press to begin animation" />
My launching activity is as follows:
public class TestActivity extends Activity {
public final String TAG="TestActivity";
boolean toTop=false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button b=(Button)findViewById(R.id.button);
b.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Toast.makeText(TestActivity.this, "left="+v.getLeft()+"\nright="+v.getRight(), Toast.LENGTH_SHORT).show();
Animation translateAnimation;
if(toTop) translateAnimation=new TranslateAnimation(0, 0, 0, -100);
else translateAnimation=new TranslateAnimation(0, 0, 0, 100);
translateAnimation.setDuration(1000);
translateAnimation.setFillEnabled(true);
translateAnimation.setFillAfter(true);
v.startAnimation(translateAnimation);
toTop=!toTop;
}
});
}
}
When I press the button, I can see it moving to the bottom. But when I press it for the second time, nothing happens. I have to click to initial rectangle of the button to begin animation again. It seems like button is drawn as expected, but actual view is remained on the same position. I want to know how I can move a view entirely, not just its visual part. Besides, I use Toast.maketext.show to ensure that coordinates of the button aren't changed from click to click.
There is an easier way worth mentioning. One can use the View.animate() method which also moves the clickable elements:
An easy solution is to add padding in the onAnimationEnd function:
where
i = (ImageView) findViewById(R.id.imgAMD);
View.layout() really works, thanks a lot, teoREtik. Here I provide working variant, which moves the button itself (hope it will be useful for somebody):
We have to invoke View.layout() only when animation is finished, so we need to use AnimationListener.onAnimationEnd. In order to be able to specify button and modifierY, I created my custom AnimationListener, which receives button and modifierY in constructor:
Yes, this is normal behavior. This is because animation just rerenders
View
's pixels, but it's position on the display remains the same. If you want to relocate yourView
to the place where your animation ends, you need to callView.layout()
method and pass there 4 parameters, which describeView
s new position on it's layout. Keep in mind thatView.layout()
gets params relative toView
s parent.