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
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):
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) {
int modifierY;
if(toTop) modifierY=-100;
else modifierY=100;
Animation translateAnimation=new TranslateAnimation(0, 0, 0, modifierY);
translateAnimation.setDuration(1000);
translateAnimation.setFillEnabled(true);
MyAnimationListener listener=new MyAnimationListener(v, modifierY,TestActivity.this);
translateAnimation.setAnimationListener(listener);
v.startAnimation(translateAnimation);
toTop=!toTop;
}
});
}
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:
public class MyAnimationListener implements AnimationListener{
View mView;
int mModifier;
Context mContext;
public MyAnimationListener(View v, int modifier, Context c){
mView=v;
mModifier=modifier;
mContext=c;
}
public void onAnimationEnd(Animation animation) {
int[] pos={mView.getLeft(),mView.getTop()+mModifier,mView.getRight(),mView.getBottom()+mModifier};
mView.layout(pos[0],pos[1],pos[2],pos[3]);
Toast.makeText(mContext, "left="+mView.getLeft()+"\ntop="+mView.getTop(), Toast.LENGTH_SHORT).show();
}
public void onAnimationRepeat(Animation animation) {}
public void onAnimationStart(Animation animation) {}
}