Кнопка Android не реагирует после анимации - PullRequest
5 голосов
/ 24 января 2010

У меня есть базовая анимация кнопки после ее нажатия в настоящее время в моем приложении. После того, как кнопка заканчивает анимацию, я больше не могу нажимать на нее. Он даже не нажимается с оранжевой подсветкой.

Любая помощь?

Вот мой код:

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

Ответы [ 3 ]

8 голосов
/ 24 января 2010

Анимации влияют только на отрисовку виджетов, что означает, что после завершения анимации ваша кнопка все еще находится в своем прежнем местоположении. Вам нужно вручную обновить параметры макета вашей кнопки, если вы хотите переместить ее на новое место. Кроме того, ваш AnimationSet и ваш AnimationController бесполезны.

6 голосов
/ 16 июля 2012

Если вы хотите иметь возможность нажать кнопку после завершения анимации, вы должны вручную переместить компонент.Вот пример анимации перевода, примененной к кнопке:

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

Метод startTapped () запускается, когда пользователь нажимает кнопку в пользовательском интерфейсе.Другая кнопка перемещается на (200,100).В конце я удаляю старый и создаю новый, а затем добавляю его в родительское представление.Вы можете видеть, что buttonTapped () вызывается после анимации.

Предложение: вы можете использовать проект NineOldAndroids , если хотите поддерживать как новый, так и старый способ анимации компонентатогда вы можете проверить версию ОС и запустить этот код только на Gingerbread и более ранних версиях.

1 голос
/ 01 сентября 2011

Я действительно боролся с перетасовкой параметров макета, чтобы "настоящая" кнопка соответствовала своему анимированному расположению. Я наконец преуспел, используя этот подход . Я расширил ImageButton и переопределил 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;
}

Тогда я мог бы использовать эту кнопку в проблемном представлении:

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

Стоит отметить, что все это меняет на 3.0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...