Domanda

Ho un'attività in cui si anima diverse viste. Le animazioni vengono attivate quando si fa clic su un relativeyout contenente alcune immagini. È impostato in OnCreate () in questo modo:

mContainer.setOnClickListener(new ContainerClicked());

E la classe ContainerClicked () sembra così:

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

Funziona e anima tutto come lo voglio.

Animatetoparty () sembra questo:

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 sopra anima alcuni pulsanti e il logo fuori mano, quindi rivela il contenitore. Per tenerlo lì, cambio i layoutparams. Il solo cambiarli produce uno sfarfallio visibile in cui il contenitore salta 60 si immerge per circa un fotogramma (l'animazione non sembra essere abbastanza finita), prima di sistemarmi dove lo voglio. Ho letto da qualche parte per rimuoverlo dal suo genitore e rimetterlo dentro, e questo non produce lo stesso sfarfallio. Tuttavia, ora il rebinding di OnClickListener non funziona!

Ho provato quasi tutto, e ora ho notato che ogni clic che non è stato "passato" se premo il pulsante Home e apro di nuovo l'applicazione.

C'è un modo migliore per evitare lo "sfarfallio"? Un modo migliore per fare le animazioni? (Sono abbastanza nuovo nelle viste animate) Perché i click-events sparano quando riapro l'applicazione?

È stato utile?

Soluzione

Per evitare lo sfarfallio che stai vedendo, devi chiamare ClearNimation () All'inizio di onanimationend

@Override
public void onAnimationEnd(Animation arg0) {
    theView.clearAnimation()
    ...
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top