【问题标题】:Android Flicker when using Animation and onAnimationEnd Listener使用 Animation 和 onAnimationEnd 侦听器时的 Android 闪烁
【发布时间】:2014-02-18 16:07:23
【问题描述】:

我有 3 个在向左填充时动画的 ImageButton,如下所示:

public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)
{
    ImageButton top;
    ImageButton left;
    ImageButton right;

    top     = meMap.get("top");
    left    = meMap.get("left");
    right   = meMap.get("right");

    goLeft =
            new TranslateAnimation(0, -(top.getLeft() - left.getLeft()), 0, -(top.getTop() - left.getTop()));

    goRight =
            new TranslateAnimation(0, -(left.getLeft() - right.getLeft()), 0, -(left.getTop() - right.getTop()));

    goTopFromRight =
            new TranslateAnimation(0, top.getLeft() - right.getLeft(), 0, top.getTop() - right.getTop());


    goRight.setAnimationListener(this);

    if (velocityX<-500)
    {
        System.out.println("aaaa "+"ScrollLeft");


        goLeft.setDuration(500);   
        goLeft.setFillAfter(true);
        goLeft.setFillAfter(true);
        top.startAnimation(goLeft);

        goRight.setDuration(500);  
        goRight.setFillAfter(true);
        goRight.setFillAfter(true);
        left.startAnimation(goRight);

        goTopFromRight.setDuration(500); 
        goTopFromRight.setFillAfter(true);
        goTopFromRight.setFillAfter(true);
        right.startAnimation(goTopFromRight);

    }

现在,我有一个这样的 onanimationEnd 监听器:

public void onAnimationEnd(Animation animation) {
    ImageButton top;
    ImageButton left;
    ImageButton right;

    top     = meMap.get("top");
    left    = meMap.get("left");
    right   = meMap.get("right");



    top.clearAnimation();
    left.clearAnimation();
    right.clearAnimation();


    RelativeLayout.LayoutParams layoutLeft = 
                new RelativeLayout.LayoutParams(
                        RelativeLayout.LayoutParams.WRAP_CONTENT,
                        RelativeLayout.LayoutParams.WRAP_CONTENT);

    layoutLeft.addRule(RelativeLayout.ALIGN_BOTTOM,R.id.CenterTextView);
    layoutLeft.addRule(RelativeLayout.LEFT_OF,R.id.CenterTextView);
    top.setLayoutParams(layoutLeft);


    RelativeLayout.LayoutParams layoutRight = 
            new RelativeLayout.LayoutParams(
                    RelativeLayout.LayoutParams.WRAP_CONTENT,
                    RelativeLayout.LayoutParams.WRAP_CONTENT);

    layoutRight.addRule(RelativeLayout.ALIGN_BOTTOM,R.id.CenterTextView);
    layoutRight.addRule(RelativeLayout.RIGHT_OF,R.id.CenterTextView);
    left.setLayoutParams(layoutRight);

    RelativeLayout.LayoutParams layoutTop = 
            new RelativeLayout.LayoutParams(
                    RelativeLayout.LayoutParams.WRAP_CONTENT,
                    RelativeLayout.LayoutParams.WRAP_CONTENT);

    layoutTop.addRule(RelativeLayout.CENTER_VERTICAL,RelativeLayout.TRUE);
    layoutTop.addRule(RelativeLayout.CENTER_HORIZONTAL,RelativeLayout.TRUE);
    right.setLayoutParams(layoutTop);


    meMap.put("top", right);
    meMap.put("left", top);
    meMap.put("right", left);

}

问题是当我做动画时(除了 goRight),我的图标会闪烁一会儿。我不知道如何解决这个问题。请帮忙。

【问题讨论】:

    标签: android android-animation


    【解决方案1】:

    安娜,我想你已经在这里阅读了我的答案

    Android TranslateAnimation resets after animation

    android animation is not finished in onAnimationEnd

    我也回复了您的评论,基本上不是在 mAnimation.setAnimationListener 方法中执行功能,而是您需要创建自定义 ImageButtons 并将功能放在那里

    public Class myImageButton extends ImageButton {
    @Override
        protected void onAnimationEnd() {
            super.onAnimationEnd();
            //Functionality here
        }
    

    【讨论】:

    • 非常感谢@Soham 的重播。事实上,如果我理解,我必须将 goRight.setAnimationListener(this);然后,我必须为我的 3 个图像按钮创建 3 个类?我很抱歉,但我是新手。
    • 是的,你完全正确,尝试创建这些类,然后在其中定义功能。
    • 事实上,公共类 myImageButton 应该在我的 Activity 中?这个类的构造函数是什么?在里面,我无法覆盖 onAnimationEnd()。
    • 对不起,我现在可以覆盖 onAnimationEnd,但不知道如何使用它,你能给我一个例子吗?
    • 你能帮我吗@Soham
    【解决方案2】:

    我搜索了所有关于动画问题(闪烁和迟缓)的 stackoverflow 帖子。 我没有找到任何完美的答案。但是我找到了相同的解决方案,如下所示,

    动画使用的开始,

    view_you_want_to_animate.setDrawingCacheEnabled(true);
    

    onEnd of Animation use,

    view_you_want_to_animate.setDrawingCacheEnabled(false);
    

    现在,当我的视图设置动画时,我的视图不会出现闪烁或迟缓行为。 我工作得很好。

    【讨论】:

    • 对我不起作用。为了澄清这应该进入 onAnimationStart 和 onAnimationEnd 对吗?
    • 是的,你需要重写 onAnimationStart 和 onAnimationEnd 方法。
    • 最终改用了animation.setFillAfter(true),从而消除了闪烁。
    猜你喜欢
    • 2011-10-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-18
    相关资源
    最近更新 更多