Кнопка не отвечает на событие Click Event после трансляции

Я выполнял анимацию перевода на кнопке, все работает как я исключен, но только проблема заключается в том, что после анимации кнопка не отвечает на событие клика, пожалуйста, исправьте меня.

Button b=(Button)findViewById(R.id.button1);
    TranslateAnimation slide=new TranslateAnimation(0, 30, 0,-40);
    slide.setDuration(500);
    slide.setZAdjustment(TranslateAnimation.ZORDER_TOP);
    slide.setFillAfter(true);

    b.startAnimation(slide);

Ответ 1

Если вы обрабатываете анимацию на API более низкого уровня (ниже HoneyComb), ваша анимация фактически не перемещает кнопку, а только ее изображения. Его щелчок будет в том же месте, где вы разместили его в своем макете.

Ответ 2

Это переведет объект в направлении y:

ObjectAnimator mover = ObjectAnimator.ofFloat(v, "translationY", 0, 400);
mover.start();

Ответ 3

Я мог бы достичь того, чего вы хотели, но вы будете управлять координатами вручную. Посмотрите, работает ли это для вас.

public class AnimationTestActivity extends Activity {

    private Button mButton;

    private LinearLayout.LayoutParams params;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mButton = (Button) findViewById(R.id.button);
        mButton.setOnClickListener(mClickListener);

        params = (LayoutParams) mButton.getLayoutParams();
    }

    private android.view.View.OnClickListener mClickListener = new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            TranslateAnimation animation = new TranslateAnimation(0, 0, 0, 400);
            animation.setDuration(2000);
            animation.setAnimationListener(mAnimationListener);
            v.startAnimation(animation);
        }
    };

    private AnimationListener mAnimationListener = new AnimationListener() {

        @Override
        public void onAnimationStart(Animation animation) {

        }

        @Override
        public void onAnimationRepeat(Animation animation) {
        }

        @Override
        public void onAnimationEnd(Animation animation) {
            params.topMargin = params.topMargin + 400;
            mButton.setLayoutParams(params);
        }
    };
}

Ответ 4

Я столкнулся с этой проблемой, и я исправил ее всего лишь секунду назад. Итак, я думаю, что я должен поделиться своим решением с вами, ребята.

  • В анимационном xml файле я удалил android:fillAfter="true", если сохранить android:fillEnabled="true".

  • Зарегистрируйте прослушиватель анимации, затем в методе onAnimationEnd() я вызываю View#Layout(), чтобы изменить положение представления.

                    int newLeft = (int) (layoutContent.getLeft() + layoutContent.getWidth() * 0.8);
                    layoutContent.layout(newLeft, 
                                        layoutContent.getTop(), 
                                        newLeft + layoutContent.getMeasuredWidth(), 
                                        layoutContent.getTop() + layoutContent.getMeasuredHeight());
    

В моем случае, что делает анимация, это то, что слайды layoutContent влево 80% от ширины.

Он отлично работает. Надеюсь, это поможет.

@Update: Сегодня вы можете использовать ObjectAnimator на Android 3.0+. Если вы разрабатываете для android под 3.0, вы можете найти его в библиотеке поддержки v.4. ObjectAnimator - это bester для анимации.

@Обновление # 2: вы можете использовать ViewPropertyAnimator в версии для Android версии более ранней версии. Он обеспечивает лучшую производительность и устраняет проблему с событиями кликов. Пример:

mButton.animate()
                .setDuration(TIME)
                .translationY(VALUE)
                .start();

Ответ 5

Анимация не меняет вид на самом деле. даже если вы установили fillAfter (true), позиция, в которой он может принять событие клика, является исходной позицией.

Ответ 6

Попробуйте использовать это:

b.layout(0, -40, b.getWidth(), b.getHeight());

Ответ 7

Я нашел простое решение, определяющее конечную позицию кнопки в макете и запуск анимации с некоторой позиции, то есть укажите fromX или fromY вместо того, чтобы ставить нуль