【问题标题】:Android Slide Animation FlashingAndroid幻灯片动画闪烁
【发布时间】:2011-12-06 00:36:33
【问题描述】:

我正在尝试为 ImageButton 设置动画。单击按钮时,我希望它向右滑动。再次点击它时,它应该会滑回原来的位置。

当动画结束时,它会回到原来的位置,因此我重新定位 ImageButton。我有一个小的“闪光灯”,其中 ImageButton 和动画都在 ImageButton 重新定位之前的原始位置。谁能告诉我如何摆脱这种“闪光”?

我编写了以下代码来启动动画,当动画结束时,移动 ImageButton 本身。 它是一个用于滑动 ImageButton 的 onClickListener 和一个用于此目的的 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>

【问题讨论】:

    标签: android animation reset translate-animation


    【解决方案1】:

    我遇到了同样的问题,并想为遇到此问题的任何人发布答案。无论您在 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);
    
    }
    

    【讨论】:

      猜你喜欢
      • 2021-12-03
      • 1970-01-01
      • 1970-01-01
      • 2013-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-12
      相关资源
      最近更新 更多