Android开发-动画 补间动画(Tween Animation)(五)

179 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第8天,点击查看活动详情

前面把补间动画的四种动画类型实现都介绍了,AlphaAnimation(渐变动画)、ScaleAnimation(缩放动画)、TranslateAnimation(位移动画)和RotateAnimation(旋转动画),各自都有各自的属性,但是共同点就是都有2种实现方式,动画设置的属性,除了自身参数设置,其他属性基本一直,那么如果我们想实现多种动画同时执行,按序执行,展示出更炫的效果,那么就可以把几种动画结合起来,通过AnimationSet来统一执行,也就是今天我们要介绍的组合动画。

AnimationSet 的实现

AnimationSet类本身是Animation类的子类,而Animation类则是用于实现基础动画效果的,AnimationSet允许一个界面组件同时执行多种动画效果。

其实通过描述或者通过源码查看,可以看出来AnimationSet其实是一个动画集合,把需要执行的动画方式初始化后,通过AnimationSet的add方法将各种动画添加进去,然后调用view的startAnimation方法就可以把多种动画的效果组合起来执行,实现多种动画按序播放的效果了,废话不多说,直接上代码。

public class MainActivity extends Activity {

    private ImageView iv_anim;
    private Button startAnim;
    private Button cancelAnim;
    private TranslateAnimation translateAnimation;
    private ScaleAnimation scaleAnimation;
    private AlphaAnimation alphaAnimation;
    private RotateAnimation rotateAnimation;
    private AnimationSet animationSet;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        //ImageView对象
        iv_anim = (ImageView) findViewById(R.id.image_anim);
        //按钮对象
        startAnim = (Button) findViewById(R.id.btn_start);               
        cancelAnim = (Button) findViewById(R.id.btn_cancel);
        translateAnimation = new TranslateAnimation(0, 200, 0, 200);                                   //设置位置变化动画  
        scaleAnimation = new
                ScaleAnimation(0f, 1f, 0f, 1f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
        //设置尺寸变化动画  
        alphaAnimation = new AlphaAnimation(0.1f, 1.0f);   //设置透明度变化动画  
        rotateAnimation = new RotateAnimation(0f, 359f);
        animationSet = new AnimationSet(true);    //建立动画集对象  
        //设置位置变化动画的持续时间  
        translateAnimation.setDuration(2000);   
        //设置尺寸变化动画的持续时间
        scaleAnimation.setDuration(2000); 
        //设置透明度渐变更画的持续时间  
        alphaAnimation.setDuration(2000);          
        rotateAnimation.setDuration(2000);
        
        //添加位置变化动画  
        animationSet.addAnimation(translateAnimation);   
        //添加尺寸变化动画
        animationSet.addAnimation(scaleAnimation);
        //添加透明度渐变更画
        animationSet.addAnimation(alphaAnimation);             
        animationSet.addAnimation(rotateAnimation);
        //停留在最后的位置
        animationSet.setFillAfter(true);                   
        animationSet.setFillEnabled(true);
        //设置动画
        iv_anim.setAnimation(animationSet);                      

        //设置监听器  
        startAnim.setOnClickListener(v -> {
            //启动动画  
            animationSet.startNow();                         
        });
        //设置监听器  
        cancelAnim.setOnClickListener(v -> {
            //取消动画执行   
            animationSet.cancel();                               
        });
    }
}

四种动画都用到了,效果随便写了下,想要什么样的效果,可以通过设置相应动画的实现就好了,想怎么炫就怎么炫,实现起来是不是也很简单,其实组合动画也可以通过xml+java的实现方式来实现,但是这里就不举例说明了,因为一般不推荐,还不如直接java代码来的直接,像实现稀奇古怪,绚丽多彩的动画效果,就打开脑洞,动起手来玩起来吧。