代码之家  ›  专栏  ›  技术社区  ›  Kristian

取消其他项目动画的正确方法

  •  0
  • Kristian  · 技术社区  · 7 年前

    我有一个容器(gridlayout),其中放置了多个视图。当我单击这些视图中的任何一个时,应该应用无限动画(以指示它是选定/选定的视图)。

    问题是我需要清除以前的动画,这样一次只能播放一个动画(对于单击的视图)。

    我想有一个动画的全局定义,然后简单地取消它一次点击并分配一个新的视图给它,但是objectanimator没有方法取消它。

    GridLayout container = (GridLayout) filterPackContainer.findViewById( R.id.container );   
    
    for( int f=0; f<10; f++ )
    {
        View child = that.getLayoutInflater().inflate( R.layout.child, null );
    
        child.setOnClickListener(new View.OnClickListener() 
        {
            @Override
            public void onClick(View v) 
            {
                ObjectAnimator anim = ObjectAnimator.ofFloat( v, "alpha", .5f, 1f );
                anim.setDuration( 1000 );
                anim.setRepeatMode( 2 );
                anim.setRepeatCount( 999999 );
                anim.start();
            }
        });
    
        container.addView( child );
    }
    

    然后我尝试将视图保存为引用,单击并使用Cyc动画()取消任何现有动画,但这没有效果,动画只是继续播放。

    View vRef = null;
    
    ---------------------
    
    GridLayout container = (GridLayout) filterPackContainer.findViewById( R.id.container );   
    
    for( int f=0; f<10; f++ )
    {
        View child = that.getLayoutInflater().inflate( R.layout.child, null );
    
        child.setOnClickListener(new View.OnClickListener() 
        {
            @Override
            public void onClick(View v) 
            {
                if( vRef != null )
                    vRef.clearAnimation();
    
                vRef = v;
    
                ObjectAnimator anim = ObjectAnimator.ofFloat( v, "alpha", .5f, 1f );
    
                anim.setDuration( 1000 );
                anim.setRepeatMode( 2 );
                anim.setRepeatCount( 999999 );
                anim.start();
            }
        });
    
        container.addView( child );
    }
    

    关于如何正确处理这个问题有什么提示吗?谢谢!

    1 回复  |  直到 7 年前
        1
  •  1
  •   Mayank Bhatnagar    7 年前

    你可以使用 AnimatorSet 来控制你的动画。这个类以指定的顺序播放一组动画对象。动画可以设置为一起播放、按顺序播放或在指定延迟后播放。

    向animatorSet添加动画有两种不同的方法:可以调用playTogether()或playSequenced()方法一次添加一组动画,也可以将play(animator)与builder类中的方法结合使用,逐个添加动画。

             AnimatorSet animatorSet = new AnimatorSet();
    
             child.setOnClickListener(new View.OnClickListener() {
    
                @Override
                public void onClick(View v) 
                {
                    if(animatorSet.isRunning)
                       animatorSet.cancel();
    
    
                    ObjectAnimator anim = ObjectAnimator.ofFloat( v, "alpha", .5f, 1f );
                    anim.setDuration( 1000 );
                    anim.setRepeatMode( 2 );
                    anim.setRepeatCount( 999999 );
    
                    AnimatorSet animatorSet = new AnimatorSet();
                    animatorSet.playTogether(anim);
                    animatorSet.start();
                }
            });
    

    希望这有帮助。