简体   繁体   中英

Android Button Doesn't Respond After Animation

I have a basic animation of a button after it is pressed currently in my application. After the button finishes animating, I can no longer click on it. It doesn't even press with an orange highlight.

Any help?

Here's my code:

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

animation = new AnimationSet(true);
animation.setFillAfter(true);
Animation translate = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 5.0f);
translate.setDuration(500);
animation.addAnimation(translate);

LayoutAnimationController controller = new LayoutAnimationController(animation, 0.25f);


generate = (Button)findViewById(R.id.Button01);

generate.setOnClickListener(new View.OnClickListener(){
    public void onClick(View v){
            keyFromTop();

        }
    });


}

public void keyFromTop(){   
    generate.setAnimation(animation);    
}

Animations affect only the drawing of widgets, which means after the animation is done, your button is still at its previous location. You need to manually update the layout parameters of your button if you want to move it to the new location. Also, your AnimationSet and your AnimationController are useless.

If you want to be able to click the button after the animation is complete, you have to manually move the component. Here's an example of a translate animation applied to a button:

public class Test2XAnimation extends Activity {

    private RelativeLayout buttonContainer;

    private Button button;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        button = (Button) this.findViewById(R.id.button1);
        buttonContainer = (RelativeLayout) button.getParent();
    }

    public void startTapped(View view) {
        animateButton(200, 100);
    }

    public void buttonTapped(View view) {
        Toast.makeText(this, "tap", Toast.LENGTH_SHORT).show();
    }

    private RelativeLayout.LayoutParams params;
    private CharSequence title;

    private void animateButton(final int translateX, final int translateY) {
        TranslateAnimation translate = new TranslateAnimation(0, translateX, 0,
                translateY);
        translate.setDuration(1500);
        translate.setAnimationListener(new AnimationListener() {

            public void onAnimationEnd(Animation animation) {
                buttonContainer.removeView(button);
                button = new Button(Test2XAnimation.this);
                button.setText(title);
                button.setOnClickListener(new OnClickListener() {

                    public void onClick(View v) {
                        buttonTapped(button);
                    }
                });

                params.leftMargin = translateX + params.leftMargin;
                params.topMargin = translateY + params.topMargin;
                params.rightMargin = 0 + params.rightMargin;
                params.bottomMargin = 0 + params.bottomMargin;
                button.setLayoutParams(params);
                buttonContainer.addView(button);
            }

            public void onAnimationRepeat(Animation animation) {

            }

            public void onAnimationStart(Animation animation) {
                params = (RelativeLayout.LayoutParams) button.getLayoutParams();

                title = button.getText();
            }

        });
        button.startAnimation(translate);
    }
}

The method startTapped() is triggered when a user clicks a button in the UI. The other button moves by (200,100). At the end, I remove the old one and create a new one, thenaI add it to the parent view. You can see that buttonTapped() is called after the animation.

A suggestion: you can use NineOldAndroids project if you want to support both the new and the old way of animating a component, then you can check the OS version and run this code only on Gingerbread and lower versions.

I really struggled with shuffling layout params to make the "real" button match up to its animated location. I finally succeeded by using this approach . I extended ImageButton and overrode getHitRect:

    @Override
public void getHitRect(Rect outRect) {
    Rect curr = new Rect();
    super.getHitRect(curr);
    outRect.bottom = curr.bottom + 75;
    outRect.top = curr.top + 75;
    outRect.left = curr.left;
    outRect.right = curr.right;
}

Then, I could use this button in the troublesome view:

<com.sample.YPlus75ImageButton a:id="@+id/....

It's worth noting that all of this changes for 3.0.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM