几次setAnimation调用后Android视图轮换没有发生

时间:2013-10-31 16:04:36

标签: android multithreading animation views

我一直在尝试编写将图像旋转到特定角度的活动方法。 旋转有效,但问题是方法每隔一秒左右调用一次,但只在前几次旋转。 在某个点上,动画的图像只是静止不动,即使动画正在设置并以不同的值开始!假设移动图像,就像前几次一样。

private void animateNeedle(final float sfAngle)
{
    final View viewNeedle = findViewById(R.id.needle);
    final RotateAnimation needleAnimation;

    RotateAnimation anim;

    anim = new RotateAnimation( 0,
        sfAngle,
        m_nNeedleWidth / 2,
        m_nNeedleHeight);
    anim.setDuration(200);
    anim.setFillAfter(true);
    viewNeedle.setAnimation(anim);
    anim.setAnimationListener(new AnimationListener()
    {

        @Override
        public void onAnimationEnd(final Animation animation)
        {
            viewNeedle.clearAnimation();
        }

        @Override
        public void onAnimationRepeat(final Animation animation)
        {
            // TODO Auto-generated method stub
        }

        @Override
        public void onAnimationStart(final Animation animation)
        {
            // TODO Auto-generated method stub
        }
    });

    anim.start();
    findViewById(android.R.id.content).postInvalidate();
}

我做错了什么? 我确保在动画期间不会调用该函数两次,但它没有帮助。

2 个答案:

答案 0 :(得分:2)

我尝试使用你的代码,它可以在以后多次调用动画。 我在旋转结束时添加了要调用的代码:

..
                viewNeedle.startAnimation(anim);
                anim.start();
..

所以要重复制作动画,就像这样:

 @Override
            public void onAnimationEnd(final Animation animation)
            {
                viewNeedle.clearAnimation();
                viewNeedle.startAnimation(anim);
                anim.start();
            }

所以我可以多次调用那个动画..

希望对你有帮助..

答案 1 :(得分:2)

问题是它没有在主线程上运行,要修复我们使用的:

anim = new RotateAnimation( m_lastAngle,
                                sfAngle,
                                viewNeedle.getWidth() / 2,
                                viewNeedle.getHeight());
    anim.setDuration(1000);
    anim.setFillAfter(true);
    viewNeedle.setAnimation(anim);
    anim.setAnimationListener(new AnimationListener()
    {
        @Override
        public void onAnimationEnd(final Animation animation)
        {
            // viewNeedle.clearAnimation();
        }

        @Override
        public void onAnimationRepeat(final Animation animation)
        {
            // TODO Auto-generated method stub

        }

        @Override
        public void onAnimationStart(final Animation animation)
        {
            m_lastAngle = sfAngle;
        }
    });

    runOnUiThread(new Runnable()
    {

        @Override
        public void run()
        {
            viewNeedle.startAnimation(anim);
            findViewById(android.R.id.content).invalidate();
        }
    });

我们也用过:

    final View viewNeedle = findViewById(R.id.needle);
    viewNeedle.getViewTreeObserver().addOnGlobalLayoutListener(
            new OnGlobalLayoutListener()
            {
                @Override
                public void onGlobalLayout()
                {
                    scaleView(viewNeedle);
                }

                /**
                 * Scale a view.
                 * 
                 * @param viewToScale - View to scale.
                 */
                private void scaleView(final View viewToScale)
                {
                    int height = (int) (viewToScale.getHeight() / GraphicsPoint
                            .getScalePoint().y);
                    int width = (int) (viewToScale.getWidth() / GraphicsPoint
                            .getScalePoint().x);
                    final LayoutParams layoutParams = viewToScale
                            .getLayoutParams();
                    layoutParams.height = height;
                    layoutParams.width = width;
                    viewToScale.setLayoutParams(layoutParams);
                    viewToScale.getViewTreeObserver()
                            .removeOnGlobalLayoutListener(this);
                }
            });