Question

J'ai une activité dans laquelle plusieurs vues s'animent. Les animations sont déclenchées lorsqu'un RelativeLayout contenant quelques images est cliqué. Il est configuré dans onCreate () comme ceci:

mContainer.setOnClickListener(new ContainerClicked());

Et la classe ContainerClicked () ressemble à ceci:

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

Cela fonctionne et anime tout comme je le souhaite.

AnimateToParty () ressemble à ceci:

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

La classe ci-dessus anime certains boutons et le logo à l'écart, puis révèle le conteneur. Afin de le garder là, je change ses paramètres de mise en page. Le simple fait de les changer produit un scintillement visible où le conteneur saute 60 pendant environ une image (l'animation ne semble pas tout à fait terminée), avant de s'installer là où je le veux. J'ai lu quelque part pour le retirer de son parent et le remettre en place, et cela ne produit pas le même scintillement. Cependant, maintenant la reliure de onclicklistener ne fonctionne plus!

J'ai essayé à peu près tout, et je viens de remarquer que chaque clic qui ne "passe pas" se déclenche si j'appuie sur le bouton d'accueil et que je rouvre l'application.

Existe-t-il un meilleur moyen d'éviter le "scintillement"? Une meilleure façon de faire les animations? (Je suis assez nouveau dans l'animation de vues) Pourquoi les événements de clic se déclenchent-ils lorsque je rouvre l'application?

Était-ce utile?

La solution

Pour éviter le scintillement que vous voyez, vous devez appeler clearAnimation () au début de onAnimationEnd

@Override
public void onAnimationEnd(Animation arg0) {
    theView.clearAnimation()
    ...
}

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top