Android Animation Flicker

Я пролистал столько веток по этой теме, сколько смог найти на мерцании, которое возникает в Android 2.2 при работе с AnimationListeners, но я не могу полностью решить свою проблему.

У меня есть «всплывающее окно» LinearLayout, к которому пользователь прикасается, чтобы переместиться вниз примерно на 100 пикселей, и касается еще раз, чтобы переместить его обратно вверх.Наконец-то я заставил его работать над первой частью без какого-либо мерцания (благодаря предложению вызвать clearAnimation () в анимируемом представлении), но при обратном (т. Е. Перемещении представления назад) мерцание на начало. Я не могу вызвать clearAnimation () в методе onAnimationStart (), так как он не будет анимироваться!

Конечно, вся анимация работает отлично, если я использовал setFillAfter () без какого-либо прослушивателя анимации, но тогда сенсорная область представления не будет перемещаться (потому что само представление «фактически» не перемещалось).

Любая помощь будет принята с благодарностью.

this.popoverTab.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
        popoverTab.setClickable(false);
        popoverTab.setFocusable(false);
        if (popoverHidden) {
            Log.d(TAG, "About to show popover");
            // the popover is currently hidden, show it.
            TranslateAnimation animation = new TranslateAnimation(0, 0, 100, 0);
            animation.setDuration(700);
            animation.setFillBefore(true);
            animation.setAnimationListener(new AnimationListener() {
                public void onAnimationEnd(Animation animation) {

                }

                public void onAnimationRepeat(Animation animation) {

                }

                public void onAnimationStart(Animation animation) {
                    footer.layout(footer.getLeft(), (footer.getTop() - 100), footer.getRight(), footer.getBottom());
                }
            });
            footer.startAnimation(animation);
        } else {
            Log.d(TAG, "About to hide popover");
            // the popover is showing, hide it.
            TranslateAnimation animation = new TranslateAnimation(0, 0, 0, 100);
            animation.setDuration(700);
            animation.setFillAfter(true);
            animation.setAnimationListener(new AnimationListener() {
                public void onAnimationEnd(Animation animation) {
                    footer.clearAnimation();
                    footer.layout(footer.getLeft(), (footer.getTop() + 100), footer.getRight(), footer.getBottom());
                }

                public void onAnimationRepeat(Animation animation) {

                }

                public void onAnimationStart(Animation animation) {

                }
            });
            footer.startAnimation(animation);
        }
        // invert.
        popoverHidden = !popoverHidden;
        popoverTab.setClickable(true);
        popoverTab.setFocusable(true);
    }

});
16
задан JRod 22 February 2012 в 00:57
поделиться