Android-слайд анимация мигает - PullRequest
3 голосов
/ 12 октября 2011

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

Когда анимация заканчивается, она возвращается в исходное положение, поэтому я перемещаю ImageButton.У меня есть небольшая «вспышка», когда и ImageButton, и анимация находятся в исходном положении до того, как ImageButton будет переставлен.Может кто-нибудь сказать мне, как избавиться от этой "вспышки"?

Я написал следующий код для запуска анимации и, когда анимация заканчивается, переместите сам ImageButton.Что это такое, это onClickListener для вставки ImageButton и AnimationListener для этого.Есть также onClickListener и AnimationListener для перемещения ImageButton назад.

private class SceneIndicatorListenerIn implements ImageButton.OnClickListener {
    ImageButton imageButton;
    public SceneIndicatorListenerIn (ImageButton imageButton) {
        this.imageButton = imageButton;
    }

    @Override
    public void onClick(View view) {
        // Create animation
        Animation anim = AnimationUtils.loadAnimation(context, R.anim.sceneindicator_in);
        anim.setAnimationListener(new SceneIndicatorListenerInDidEnd(imageButton));
        view.startAnimation(anim);
    }
}

private class SceneIndicatorListenerInDidEnd implements AnimationListener {
    ImageButton imageButton;
    public SceneIndicatorListenerInDidEnd (ImageButton imageButton) {
        this.imageButton = imageButton;
    }

    @Override
    public void onAnimationEnd(Animation anim) {
        Log.d(LOG_TAG, "In animation did end");

        // This is for density pixels
        float dp = context.getResources().getDisplayMetrics().density;

        // Keep position after animation
        RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(imageButton.getWidth(), imageButton.getHeight());
        params.setMargins((int) (0 * dp), imageButton.getTop(), 0, 0);
        imageButton.setLayoutParams(params);

        // Change on click listener
        imageButton.setOnClickListener(new SceneIndicatorListenerOut(imageButton));
    }

    @Override
    public void onAnimationRepeat(Animation arg0) {}

    @Override
    public void onAnimationStart(Animation arg0) {}
}

private class SceneIndicatorListenerOut implements ImageButton.OnClickListener {
    ImageButton imageButton;
    public SceneIndicatorListenerOut (ImageButton imageButton) {
        Log.d(LOG_TAG, "My imageButton was set");
        this.imageButton = imageButton;
    }

    @Override
    public void onClick(View view) {
        Log.d(LOG_TAG, "You clicked me");

        // Create animation
        Animation anim = AnimationUtils.loadAnimation(context, R.anim.sceneindicator_out);
        anim.setAnimationListener(new SceneIndicatorListenerOutDidEnd(imageButton));
        view.startAnimation(anim);
    }
}

private class SceneIndicatorListenerOutDidEnd implements AnimationListener {
    ImageButton imageButton;
    public SceneIndicatorListenerOutDidEnd (ImageButton imageButton) {
        this.imageButton = imageButton;
    }

    @Override
    public void onAnimationEnd(Animation anim) {
        Log.d(LOG_TAG, "Out animation did end");

        // This is for density pixels
        float dp = context.getResources().getDisplayMetrics().density;

        // Keep position after animation
        RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(imageButton.getWidth(), imageButton.getHeight());
        params.setMargins((int) (-199 * dp), imageButton.getTop(), 0, 0);
        imageButton.setLayoutParams(params);

        // Change on click listener
        imageButton.setOnClickListener(new SceneIndicatorListenerIn(imageButton));
    }

    @Override
    public void onAnimationRepeat(Animation arg0) {}

    @Override
    public void onAnimationStart(Animation arg0) {}
}

Это моя анимация для скольжения в:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="0%"
               android:toXDelta="83%"
               android:duration="750" />
</set>

И это моя анимация для скольжения назад:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="0%"
               android:toXDelta="-80%"
               android:duration="750" />
</set>

1 Ответ

0 голосов
/ 29 июля 2014

У меня была такая же проблема, и я хотел опубликовать ответ для всех, кто сталкивался с этим. Существует ошибка, которая вызывает это независимо от того, что вы установили в XML или иным образом.

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

image.setX(-5000);//Really any number off of the screen will do

Animation animation0 = AnimationUtils.loadAnimation(this,
            R.anim.slide_across_right);
animation0.setAnimationListener(new AnimationListener() {

        @Override
        public void onAnimationStart(Animation animation) {
            animationHack();
        }

        @Override
        public void onAnimationRepeat(Animation animation) {
        }

        @Override
        public void onAnimationEnd(Animation animation) {
        }
});



private void animationHack() {
    (new Handler()).postDelayed(new Runnable() {
        public void run() {
            image.setX(0);
        }
    }, 20);

}
...