OnClickListener не запускается, пока onResume () - PullRequest
1 голос
/ 16 июня 2011

У меня есть действие, в котором оживляются несколько видов.Анимации запускаются при нажатии RelativeLayout, содержащем несколько изображений.Он настроен в onCreate () следующим образом:

mContainer.setOnClickListener(new ContainerClicked());

И класс ContainerClicked () выглядит так:

private class ContainerClicked implements OnClickListener {

    @Override
    public void onClick(View arg0) {
        Log.i(TAG, "TEST!");
        mSomeButton.setOnClickListener(null);
        mSomeButton.setEnabled(false);

        mAnotherButton.setOnClickListener(null);
        mAnotherButton.setEnabled(false);

        mYetAnotherButton.setOnClickListener(null);
        mYetAnotherButton.setEnabled(false);

        mContainer.setOnClickListener(null);
        if (mLogo.getVisibility() == View.VISIBLE)
            new AnimateToParty().execute();
        else
            new AnimateFromParty().execute();
    }
}

Это работает и анимирует все так, как я этого хочу.

AnimateToParty () выглядит следующим образом:

private class AnimateToParty extends AsyncTask<Void, Integer, Void> {

    @Override
    protected void onProgressUpdate(final Integer... values) {
        final View theView = findViewById(values[0]);
        if (!(values[0] == mBackgroundImage.getId() || values[0] == mContainer
                .getId())) {
            final Animation animation = AnimationUtils.loadAnimation(
                    DashboardActivity.this, values[1]);
            animation.setAnimationListener(new AnimationListener() {

                @Override
                public void onAnimationStart(Animation arg0) {
                }

                @Override
                public void onAnimationRepeat(Animation arg0) {
                }

                @Override
                public void onAnimationEnd(Animation arg0) {
                    theView.setVisibility(View.INVISIBLE);
                }
            });
            theView.startAnimation(animation);
        } else if (values[0] == mBackgroundImage.getId()) {
            TransitionDrawable transition = (TransitionDrawable) theView
                    .getBackground();
            transition.startTransition(getResources().getInteger(
                    android.R.integer.config_mediumAnimTime));
        } else {
            TranslateAnimation animation = new TranslateAnimation(0, 0, 0,
                    TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
                            -60, getResources().getDisplayMetrics()));
            animation.setAnimationListener(new AnimationListener() {

                @Override
                public void onAnimationStart(Animation arg0) {
                }

                @Override
                public void onAnimationRepeat(Animation arg0) {
                }

                @Override
                public void onAnimationEnd(Animation arg0) {
                    LayoutParams lp = (LayoutParams) mContainer
                            .getLayoutParams();
                    lp.bottomMargin = 0;
                    RelativeLayout parent = (RelativeLayout) mContainer
                            .getParent();
                    mSomeButton.setVisibility(View.GONE);
                    mAnotherButton.setVisibility(View.GONE);
                    mYetAnotherButton.setVisibility(View.GONE);
                    mLogo.setVisibility(View.GONE);
                    // mContainer.setLayoutParams(lp);
                    // This caused a visible flicker, so I went with the solution below.
                    parent.removeView(mContainer);
                    parent.addView(mContainer, lp);
                }
            });
            animation.setDuration(1000);
            mContainer.startAnimation(animation);
        }
    }

    @Override
    protected Void doInBackground(Void... arg0) {
        try {
            publishProgress(mContainer.getId());
            publishProgress(mLogo.getId(), R.anim.slide_out_up);
            Thread.sleep(100);
            publishProgress(mSomeButton.getId(), R.anim.slide_out_left);
            Thread.sleep(110);
            publishProgress(mAnotherButton.getId(), R.anim.slide_out_left);
            Thread.sleep(120);
            publishProgress(mYetAnotherButton.getId(), R.anim.slide_out_left);
            Thread.sleep(130);
            publishProgress(mBackgroundImage.getId());
            Thread.sleep(550);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        mContainer.setOnClickListener(new LighterClicked());
    }
}

Приведенный выше класс анимирует некоторые кнопки и логотип, а затем открывает контейнер.Чтобы сохранить его, я изменяю его макеты.Простое их изменение вызывает видимое мерцание, когда контейнер подпрыгивает на 60 в течение примерно одного кадра (анимация кажется не совсем завершенной), прежде чем остановиться там, где я этого хочу.Я читаю где-то, чтобы удалить его от родителя и положить обратно, и это не производит тот же мерцание.Тем не менее, теперь перепривязка onclicklistener не работает!

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

Есть ли лучший способ избежать "мерцания"?Лучший способ сделать анимацию?(Я совершенно новичок в анимации представлений) Почему события click запускаются при повторном открытии приложения?

1 Ответ

4 голосов
/ 17 июня 2011

Чтобы избежать мерцания, которое вы видите, вы должны вызвать clearAnimation () в начале onAnimationEnd

@Override
public void onAnimationEnd(Animation arg0) {
    theView.clearAnimation()
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...