Android 动画学习(一)

       android平台的动画以android 3.0作为一个分界点,在3.0之前android提供了Tween Animation和Drawable Animation;动画效果也比较简单,只有简单缩放、平移、旋转和更改透明度;这两种只作用于view,归为View Animation。在android3.0提供了属性动画,为了兼容android3.0以下的动画开发可以使用一个叫NineOldanimiations的库

一、View Animation

    对应的view子类有TranslateAnimation、ScaleAnimation、AlphaAnimation和RotateAnimation; View Animation应用有着较大的局限性,作用在view对象上面而不改变view对象本身,简单来说只是改变了view的绘制,例如一个Button的坐标为(0,0),使用tweenAnimation使它移动了(dx,dy),但是你在原先的button的位置点击仍然会出发button的点击事件。可以使用在res/anim/文件夹下创建动画的xml文件,然后使用AnimationUtils.loadAnimation(context, R.anim.test);导入动画的xml文件示例如下

<?xmlversion="1.0"encoding="utf-8"?>
<alphaxmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="500"
    android:fromAlpha="0.0"
    android:interpolator="@android:anim/accelerate_interpolator"
    android:toAlpha="1.0"/> 
<translate
        android:duration="300"
        android:fromXDelta="100.0%p"
        android:toXDelta="0.0"/>
<scale
        android:duration="@android:integer/config_shortAnimTime"
        android:fromXScale="1.0"
        android:fromYScale="1.0"
        android:pivotX="50%"
        android:pivotY="0%"
        android:toXScale="0.3"
        android:toYScale="0.3"/>



   帧动画是顺序播放一组预先定义好的图片,对应的类有animationDrawable,AnimationDrawable使用xml文件来定义,文件路径在drawble文件夹中

<?xmlversion="1.0"encoding="utf-8"?>
<animation-listxmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false">

    <item
        android:drawable="@drawable/first"
        android:duration="500"/>

    <item
        android:drawable="@drawable/second"
        android:duration="500"/>

    <item
        android:drawable="@drawable/third"
        android:duration="500"/>

    <item
        android:drawable="@drawable/forth"
        android:duration="500"/>

</animation-list>

在代码中使用可以跟设置view的背景图一样设置

view.setBackgroudResource(R.drawable.animationdrawable);



二、属性动画

       Animator主要的子类有ValueAnimator 、ObjectAnimator;Animator通过PropertyValuesHolder更新对象的目标属性;如果有设置目标属性的Property对象则通过property对象的setter方法来更新属性值;没设置property对象则通过反射的形式调用目标属性的setter方法来更新属性值,所设置的属性值来源于通过时间插值器和类型估值器计算得到的KeyFrameSet来计算得出。

  (1)ValueAnimator是Animator的子类,实现了动画的整个处理逻辑,是属性动画核心的类 ,它的一个子类ObjectAnimatior是对象属性动画操作的类,通过该类使用动画的形式操作对象的属性
  
  (2)TimeInterpolator  时间插值器,根据时间流逝的百分比来计算当前的属性值改变的百分比,系统自带的LinearInterpolator,线性插值器,随着时间的流逝属性均匀的发生变化;AccerlerateDeceleratenterpolator加速减速插值器和decelerateInterpolator减速插值器。
  (3)TypeEvaluator为类型估值算法,根据属性改变的百分比来计算改变后的属性值
  (4)property属性对象,定义了属性的set和get方法
  (5)propertyValueHolder是持有目标属性property、setter和getter方法以及关键证集合的类,用来更新对象的目标属性
  (6)KeyframeSet存储一个动画的关键帧的集合
  (7)AnimationProxy是在android 3.0以下使用View的属性动画的辅助类

   下面使用ObjectAnimator和ValueAnimator实现简单的动画效果

    
private void translationX() {

    ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, screenWidth - iv_ball.getWidth());
    valueAnimator.setTarget(iv_ball);
    valueAnimator.setDuration(5000).start();
    valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator valueAnimator) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
                iv_ball.setTranslationX((float) valueAnimator.getAnimatedValue());
            }
        }
    });

}

private void translationY() {
    ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, screenHeight - iv_ball.getHeight());
    valueAnimator.setTarget(iv_ball);
    valueAnimator.setDuration(5000).start();
    valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator valueAnimator) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
                iv_ball.setTranslationY((float) valueAnimator.getAnimatedValue());
                iv_ball.setAlpha((float)valueAnimator.getAnimatedValue());
            }
        }
    });
}

private void parabola() {
    ValueAnimator valueAnimator = new ValueAnimator();
    valueAnimator.setDuration(10000);
    valueAnimator.setObjectValues(new PointF(0, 0));
    valueAnimator.setInterpolator(new LinearInterpolator());
    valueAnimator.setEvaluator(new TypeEvaluator<PointF>() {
        @Override
        public PointF evaluate(float v, PointF start, PointF end) {
            PointF p = new PointF();
            p.x = 200 * v * 3;
            p.y = 0.5f * 200 * (v * 3) * (v * 3);
            return p;
        }
    });
    valueAnimator.start();
    valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator valueAnimator) {
            PointF p = (PointF)valueAnimator.getAnimatedValue();
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
                iv_ball.setX(p.x);
                iv_ball.setY(p.y);
            }

        }
    });

}

private void parabolaRotate() {

    ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(iv_ball, "alpha", 0.5f);
    ValueAnimator valueAnimator = new ValueAnimator();
    valueAnimator.setObjectValues(new PointF(0, 0));
    valueAnimator.setEvaluator(new TypeEvaluator<PointF>() {
        @Override
        public PointF evaluate(float v, PointF start, PointF end) {
            PointF p = new PointF();
            p.x = 200 * v * 3;
            p.y = 0.5f * 200 * (v * 3) * (v * 3);
            return p;
        }
    });
    valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator valueAnimator) {
            PointF p = (PointF) valueAnimator.getAnimatedValue();
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
                iv_ball.setX(p.x);
                iv_ball.setY(p.y);
            }

        }
    });
    AnimatorSet animatorSet = new AnimatorSet();
    animatorSet.setDuration(10000);
    animatorSet.setInterpolator(new LinearInterpolator());
    animatorSet.playTogether(objectAnimator, valueAnimator);
    animatorSet.start();

}

   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值