Android 动画

Android动画就哪几类,他们的特点和区别时什么

Android动画就三种 第一个补间动画 第二种帧动画 第三中属性动画(3.0开始)

tweened animation 补间动画 通过对场景对象不懂做图像的变化(评议 缩放 旋转)产生动画效果
frame-by-frame animation 帧动画 顺序播放事先准备好的图像,类似电影一样

这两种动画类型都能在任何View对象中使用,用来提供简单的旋转计时器,

Property animation 属性动画 未完成

帧动画 可以使用代码和XML两种实现方式

AnimactionDrawable 通过这个对象我们可以使用代码来创建一个帧动画

```
    //创建对象
    AnimationDrawable animaction = new AnimationDrawable();
    //设置帧动画用的图片
    animation.addFrame(R.drawable.xx, 100);
    //关联imageView
    imageView.setBackground(animation);

    //循环执行动画,默认只执行一次
    animation.setOnShot(false);

    //执行帧动画
    animation.start();
    //停止动画
    if(animation.isRunning())
        animation.start();

```
XML实现帧动画,首先我们再res文件里面创建一个固定名字drawable文件夹,然后创建xml文件,

``` 假设文件名字animation.xml
  <?xml>
    <animation-list>
        <item android:drawable="" android:duration=""></item>
    </animation-list>


    //然后通过代码加载xml

    AnimationDrawable animDrawable = getResouces().getDrawable(R.drawable.animation);

    //启动和停止是一样的
```

补间动画 (tween)常见使用有 缩放(scale) 位移(translation) 透明度(alpaha) 旋转(rotate)。也是有2种方式实现代码和XML实现

```代码实现
    //位移动画
    // fromXType 开始点的X坐标 相对于自己 相对父容器或相对自己
    // formxvalue 开始位置数字
    TranslateAnimation translateAnimation = new TranslateAnimation(fromXTye, formXValue, toXType,toXValue, 
                        formYType, fromYValue, toYType, toYValue);
    //意思就是说相对父容器x 再0这个位置 到父容器1(就是父容器的宽)后面的参数同理
    //其实这里面的使用的都是偏移量区分正负  
    new TranslateAnimation(Animation.RELATIVE_TO_PARENT, 0, Animation.RELATIVE_TO_PARENT,1.0f, 
                        Animation.RELATIVE_TO_PARENT, 0, Animation.RELATIVE_TO_PARENT, 1.0f);

    //必要设置。动画执行时间,单位毫秒
    transleAnimation.setDuration(3000)
    //设置循环运行次数 Animation.INFINITE是无穷,也就说永远不停止
    transleAnimation.setRepeatCount(Animation.INFINITE)
    //设置是否填充 其实就是动画执行完毕后view是不是停在位置后的位置而不是回到原来的位置,默认是false
    transleAnmiation.setFillAfter(true)
    //设置动画重复模式 两个模式 RESTART 重新开始 REVERSE 往复
    transleAnimation.setReperatMode(Animation.RESTART)
    //关联View
    imageView.setAnimation(transleAnimation)
    //启动动画
    transleAnimation.start()

    //旋转动画
    //根据上一个位置动画就知道了0 360 第一个是旋转初始度数,一个旋转多少度,后面四个参数分别是先对谁,再什么位置旋转。一半情况旋转都是相对自己来说的
    自己长度和宽度的一半也就是中心点旋转
    RotateAnimation rotateAnimation = new RotateAnimation(0 , 360, Animation.RELATVIE_TO_SELF, 0.5f,
                            Animation.REVATVIE_TO_SELF, 0,5f)
    //设置动画时长 必要设置 
    rotateAnimation.setDuration(3000)
    //其他设置如位移动画一样

    //透明度动画
    //参数就是初始0 不可见 1就是可见没有透明度
    AlphaAnimation alphaAnimation = new AlpahaAnimation(0 , 1)
    //设置动画时长
    alpahaAnimation.setDuration(3000)

    //缩放动画
    //前四个参数,什么位置开始 缩放多少 fromx x轴起点坐标 tox就是x轴的终点坐标 后两个就是y轴的起终点坐标
    //pivoteXType 相对那个参照物 还是2种 一个相对自己 一个是相对父容器 
    //pivoteXValue 相对于谁的什么位置缩放
    ScaleAnimation scaleAnimation = new ScaleAnimation(formX, toX, formY, toY, pivotXType, pivotXValue, pivotYType, pivotYValue)
    //这样就是说缩放3倍,相对自己的中心点缩放
    new ScaleAnimation(0, 3.0f, 0, 3.0f, Animation.RELATVIE_TO_SELF, 0.5, Animation.RELATVIE_TO_SELF, 0.5)
    //设置动画时长
    scaleAnimation.setDuration(3000)

   //组合动画实现
   //AnimationSet 创建参数false 就是不设置动画差速器,差速器可以然后动画先快后慢之类的速度效果后面说
   AnimationSet animSet = new AnimationSet(false)

   //将上面的动画添加到集合中,可以添加多个 都需要分别设置时长 重复次数 和 重复模式 
   //特别注意当组合动画添加的时候,请将位移动画最后一个加入到动画集合中,如果不放在最后添加可能会出现位移不准确的情况 为啥不是太清楚
   animSet.addAnimation(alphaAnimation)

   //将动画效果设置到view上面
   iamgeView.setAnimation(animSet)
   //执行动画
   animSet.start()

   //关于多个动画分别执行后组合,意思就是有一个动画执行完后再执行另一个动画  动画执行的监听
   //设置动画监听
   animation.setAnimationListener(new AnimationListener(){
       //动画开始
       public void onAnimationStart(Animation arg0){

       }
       //动画重复
       public void onAnimationRepeat(Animation arg0){

       }
       //动画结束
       public void onAnimationEnd(Animation arg0){

       }
   });

   //XML生成补间动画   再res文件夹下创建anim文件夹
   //位移xml 文件名称translate 节点名称一看就知道了,这里说明一下100%p 就是相对父容器 没有p就是相对自己来说的
   <xml?> 
   <translate xmls="......" 
    android:fromXDelta="0"
    android:fromYDelta="0"
    android:toXDelta="100%p"
    android.toYDelta="100%p"
    android:duration="3000"
    android:repeatCount="infinite"
    android:repeatMode="restart|reverse">
   </translate>
   //加载xml文件
   Animation anim = AnimationUtils.loadAnimation(context, R.anim.translate)
   //其他三种都是一样不再描述了
   //xml组合动画  类似下面的写法
    <xml?> 
    <set>
        <translate xmls="......" 
            android:fromXDelta="0"
            android:fromYDelta="0"
            android:toXDelta="100%p"
            android.toYDelta="100%p"
            android:duration="3000"
            android:repeatCount="infinite"
            android:repeatMode="restart|reverse">
        </translate>
        <scale ......>
        <alpaha ...>
    </set>
```


//补间动画插值器Interpolator
AccelerateDecelerateInterpolator   先加速在减速
AccelerateInterpolator             加速
AnticipateInterpolator             先回退一小步然后加速前进
AnticipateOvershootInterpolator    再上一个基础上超出终点一小步再回到终点
BounceInterpolator                 最后阶段弹球效果
CycleInterpolator                  周期运动
DecelerateInterpolator             减速
LinearInterpolator                 匀速
OvershootIntpolator                快速到达终点并超出一小步后回到终点


```
    //如果设置true 就是说明动画集合里面所有的动画都使用统一一个插值器,false则相反
    AnimationSet animationSet = new AnimationSet(true)
    //设置插值器
    animationSet.setinterpolator(new BounceInterpolator())
    //对于AnimationSet 不能统一停止,只能分别停止子动画
```


属性动画 property animation 常用API ValueAnimation ObjectAnimation TimeAnimation 

属性动画动画参数
translationX    沿X轴位移
translationY    沿Y轴位移
rotationY       沿Y轴旋转
rotationX       沿X轴旋转
rotation        沿中心点旋转
alpha           透明度
scaleX          沿X轴缩放
scaleY          沿Y轴缩放


```
//位移动画  
//obejct 谁要执行这个动画,也就是执行动画的View
//property 是执行什么动作 也就上面罗列的属性字符串
//最后一个参数比较有意思,它是一个可变参数 也就是数组
ObjectAnimation object_transla = ObjactAnimation.ofFloat(object, property, obj...)
//上面这个位移动画实际应该是这个样子的. 最后数组就是x轴位移的数值,
//如果我们写一个均匀递增那么动画就是匀速执行,
//如果不是这根绝数组种差值大小的变化而加速或减速。
ObjectAnimation object_transla 
    = ObjectAnimation.ofFloat(view, "translationX", 10 ,20 ,30 ,50 ,100 , 200, 500 ,700)
//设置动画时长
object_transla.setDuration(5000)
//设置重复次数
object_transla.setRepeatCount(2)//无线重复ObjectAnimation.INFINITE 

//启动动画
object_transla.start() 

```
//属性动画组合

//第一种组合实现
```
  //设置属性动画的数据及动画效果
  PropertyValuseHolder translate_animation = PropertyValuesHolder.ofFloat(property, obj...)
  PropertyValuseHolder scale_animation = PropertyValuesHolder.ofFloat(property, obj...)
  PropertyValuseHolder rotate_animation = PropertyValuesHolder.ofFloat(property, obj...)

  ObjectAnimation animation = ObajctAnimation
    .ofPropertyValuesHolder(view, translate_animation, scale_animation, rotate_animation)

  animation.setDuration(5000)

  animation.start();

```

第二种组合实现

```

    ObjectAnimation objectAnim = ObjectAnimation.ofFloat(view, "", 1.0f , 0)

    //设置刷新监听
    objectAnim.addUpdateListener(new AnimationUpdateListener(){
        public void onAnimationUpate(ValueAnimation animation){
            //获取当前的值
            float value = (Float) animation.getAnimatedValue();
            //设置内容
            view.setScaleX(value);
            view.setScaleY(value);
            view.setAlpha(value);

        }
    });

    objectAnim.setDuration(50000)
    objectAnim.start()



```



//属性动画加强

```
    //执行属性动画
    ValueAnimation valueAnim = new ValueAnimation();
    //初始位置
    valuesAnim.setObjectValues(new PointF(0, 0));
    valuesAnim.setDuraion(10000)
    //设置属性动画的执行过程数据
    valueAnim.setEvaluator(new TypeEvaluator<PointF>(){
        public PointF evaluate(float fraction, PointF startValue, 
            PointF endValue){
            //fraction 就是当前的时间处以duration的比值
            //startValue 起始点的数值
            //endValue  终点的数值

            PointF pointf = new PointF()

            pointf.x = fraction * width;
            pointf.y = (float) Math.sqrt(pointf.x * width)


            return pointf
        }
    })

    //设置动画变化的监听
    valueAnim.addUpdateListener(new AnimationUpdateListener(){
        public void onAnimationUpdate(valueAnimation animation){
           //当前位置点
           PointF point = animation.getAnimationValue();
           //设置当前View的位置
           imageView.setTranslationX(pointf.x)
           imageView.setTranslationY(pointf.y)

        }
    });

    valuesAnim.start()

```
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值