Button is not clickable after TranslateAnimation

后端 未结 4 651
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-03 21:01

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

4条回答
  •  我在风中等你
    2020-12-03 21:39

    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) {}
    
    }
    

提交回复
热议问题