View动画、Drawable动画、Property动画介绍

View动画

<alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="1000"
    android:fillAfter="true"
    android:fromAlpha="1.0"
    android:repeatCount="2"
    android:toAlpha="0.3" >

</alpha>
<!--
android:duration  执行时间
android:fillAfter  动画停留在结束位置
android:repeatCount  重复次数

android:fromAlpha  动画开始状态
android:toAlpha  动画结束状态
 说明: 
                0.0表示完全透明
                1.0表示完全不透明
                       以上值取0.0-1.0之间的float数据类型的数字
-->

View动画Set 使用
如果 set 标签是父级标签, 子标签设置:android:fillAfter=”true” 是无效的

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <alpha
        android:duration="1000"
        android:fromAlpha="1.0"
        android:toAlpha="0.3" />

    <rotate
        android:duration="1000"
        android:fromDegrees="0"
        android:interpolator="@android:anim/linear_interpolator"
        android:pivotX="50%"
        android:pivotY="50%"
        android:repeatCount="-1"
        android:repeatMode="restart"
        android:startOffset="-1"
        android:toDegrees="+360" />

    <scale
        android:duration="1000"
        android:fromXScale="1.0"
        android:fromYScale="1.0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toXScale="0.5"
        android:toYScale="0.5" />

    <translate
        android:duration="2000"
        android:fromXDelta="0%"
        android:fromYDelta="0%"
        android:toXDelta="100%"
        android:toYDelta="100%" />

</set>

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="1000"
    android:fromDegrees="0"
    android:interpolator="@android:anim/linear_interpolator"
    android:pivotX="20%p"
    android:pivotY="20%p"
    android:repeatCount="-1"
    android:repeatMode="restart"
    android:startOffset="-1"
    android:toDegrees="+360" >

</rotate>
<!--
android:fromDegrees  角度,从哪开始旋转
android:toDegrees  角度,旋转到哪里结束
    说明:
        当角度为负数——表示逆时针旋转
        当角度为正数——表示顺时针旋转              
            (负数from——to正数:顺时针旋转)   
            (负数from——to负数:逆时针旋转) 
            (正数from——to正数:顺时针旋转) 
            (正数from——to负数:逆时针旋转)   

android:interpolator  插值器  ,定义动画的变化率。

AccelerateDecelerateInterpolator    @android:anim/accelerate_decelerate_interpolator    动画始末速率较慢,中间加速
AccelerateInterpolator              @android:anim/accelerate_interpolator   动画开始速率较慢,之后慢慢加速
AnticipateInterpolator              @android:anim/anticipate_interpolator   开始的时候从后向前甩
AnticipateOvershootInterpolator     @android:anim/anticipate_overshoot_interpolator 类似上面AnticipateInterpolator
BounceInterpolator                  @android:anim/bounce_interpolator   动画结束时弹起
CycleInterpolator                   @android:anim/cycle_interpolator    循环播放速率改变为正弦曲线
DecelerateInterpolator              @android:anim/decelerate_interpolator   动画开始快然后慢
LinearInterpolator                  @android:anim/linear_interpolator   动画匀速改变
OvershootInterpolator               @android:anim/overshoot_interpolator    向前弹出一定值之后回到原来位置
PathInterpolator                    新增,定义路径坐标后按照路径坐标来跑。,,,这个不知道怎么用


android:pivotX  旋转时,X轴的作用位置
android:pivotY  旋转时,Y轴的作用位置
    说明:
        以上两个属性值 从0%-100%中取值
        50%为物件的X或Y方向坐标上的中点位置

        0.数值、百分数、百分数p
        1.譬如50表示以当前View左上角坐标加50px为初始点、
        2.50%表示以当前View的左上角加上当前View宽高的50%做为初始点、
        3.50%p表示以当前View的左上角加上父控件宽高的50%做为初始点
android:repeatCount  重复次数,不写默认是1次,写了数值是数值+1次,-1 是无限重复执行
android:repeatMode  动画的正restart 反 reverse
android:startOffset  动画执行之后,等待开始运行的时间


-->

<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="1000"
    android:fillAfter="true"
    android:fromXScale="1.0"
    android:fromYScale="1.0"
    android:pivotX="50%p"
    android:pivotY="50%p"
    android:repeatCount="1"
    android:toXScale="0.0"
    android:toYScale="0.0" >

</scale>
<!--
android:duration  动画执行时间
android:fillAfter  动画停留在执行结束后的位置


android:fromXScale  X轴开始缩放的比例
android:fromYScale  Y轴开始缩放的比例
android:toXScale  X轴结束缩放的比例
android:toYScale  Y轴结束缩放的比例
    说明:
        以上四种属性值    
           0.0表示收缩到没有 
           1.0表示正常无伸缩     
                        值小于1.0表示收缩  
                        值大于1.0表示放大


android:pivotX  缩放时,动画相对于物件的X坐标的开始位置
android:pivotY  缩放时,动画相对于物件的Y坐标的开始位置
    说明:
        以上两个属性值 从0%-100%中取值
        50%为物件的X或Y方向坐标上的中点位置

        0.数值、百分数、百分数p
        1.譬如50表示以当前View左上角坐标加50px为初始点、
        2.50%表示以当前View的左上角加上当前View宽高的50%做为初始点、
        3.50%p表示以当前View的左上角加上父控件宽高的50%做为初始点

android:repeatCount  缩放重复次数
-->

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="2000"
    android:fillAfter="true"
    android:fromXDelta="0%"
    android:fromYDelta="0%"
    android:toXDelta="100%"
    android:toYDelta="100%" >

</translate>
<!--
android:fromXDelta  X轴位移的开始的位置
android:fromYDelta  .....
android:toXDelta  X轴位移的结束的位置
android:toYDelta  .....
    注意:
        没有指定fromXType toXType fromYType toYType 时候,
        默认是以自己为相对参照物    

android:fillAfter  动画执行完,停留在结束位置,但是如果跟<set 组合动画一起使用,android:fillAfter 无效。

    使用:
        Animation list1_xml = AnimationUtils.loadAnimation(this, R.anim.list1);
        setBtn.startAnimation(list1_xml);
        list1_xml 这个对象也,可以设置监听器以及一些其他的功能
-->

Drawable动画

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false">
    <item android:drawable="@drawable/amp1" android:duration="200" />
    <item android:drawable="@drawable/amp2" android:duration="200" />
    <item android:drawable="@drawable/amp3" android:duration="200" />
    <item android:drawable="@drawable/amp4" android:duration="200" />
    <item android:drawable="@drawable/amp5" android:duration="200" />
    <item android:drawable="@drawable/amp6" android:duration="200" />
    <item android:drawable="@drawable/amp7" android:duration="200" />
</animation-list>

<!--

    drawableAnimBtn = findViewById(R.id.drawable_anim);
    drawableAnimBtn.setBackgroundResource(R.anim.drawable_anim);
    AnimationDrawable drawableAnimation = (AnimationDrawable) drawableAnimBtn.getBackground();
    drawableAnimation.start();

    特别注意,AnimationDrawable的start()方法不能在Activity的onCreate方法中调运,
    因为AnimationDrawable还未完全附着到window上,
    所以最好的调运时机是onWindowFocusChanged()方法中。
-->

Property 动画

XML 使用
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:ordering="together" >

    <objectAnimator
        android:duration="1000"
        android:propertyName="scaleX"
        android:valueFrom="1"
        android:valueTo="2" >
    </objectAnimator>
    <objectAnimator
        android:duration="1000"
        android:propertyName="scaleY"
        android:valueFrom="1"
        android:valueTo="2" >
    </objectAnimator>
</set>
<!--
android:ordering
    <set>标签的android:ordering属性规定了这个set中的动画的执行顺序。该属性值默认是together (default)。
    sequentially:顺序执行;
    together:同时执行;
附加:
    <set> 既java代码里面的 AnimatorSet 
    <animator> 既java代码里面的 ValueAnimator
    <objectAnimator> 既java代码里面的ObjectAnimator 


android:duration  动画执行时间
android:propertyName  要执行的动画类型,参数可配

android:valueFrom  动画开始位置
android:valueTo  动画结束位置
注意:
    开始参数跟结束参数的关系是:倍率关系。


用户加载属性动画的xml文件 ,java代码示例:
        Animator anim = AnimatorInflater.loadAnimator(this, R.animator.scaleX_Y);
        anim.setTarget(mMv);
        anim.start();
-->

AnimatorSet 使用
        ObjectAnimator anim1 = ObjectAnimator.ofFloat(mViwe, "scaleX", 1.0f, 2f);
        ObjectAnimator anim2 = ObjectAnimator.ofFloat(mViwe, "scaleY", 1.0f, 2f);
        ObjectAnimator anim3 = ObjectAnimator.ofFloat(mViwe, "x", cx, 0f);
        ObjectAnimator anim4 = ObjectAnimator.ofFloat(mViwe, "x", cx);
        ObjectAnimator anim5 = ObjectAnimator.ofFloat(mViwe, "scaleX", 2f, 1.0f);
        ObjectAnimator anim6 = ObjectAnimator.ofFloat(mViwe, "scaleY", 2f, 1.0f);

        /**
         * anim1,anim2,anim3同时执行 anim4接着执行
         */
        AnimatorSet animSet = new AnimatorSet();
        animSet.play(anim1).with(anim2);
        animSet.play(anim2).with(anim3);
        animSet.play(anim4).after(anim3);
        animSet.play(anim5).with(anim6);
        animSet.play(anim6).after(anim4);
        animSet.setDuration(100);
        //插值器,增加动画特效
        //animSet.setInterpolator(new LinearInterpolator());
        //两个动画同时执行
        //animSet.playTogether(anim1, anim2);
        //顺序执行
        //animSet.playSequentially(anim1,anim2);
        animSet.start();

PropertyValuesHolder 使用
        PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("alpha", 1f, 0f, 1f);
        PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat("scaleX", 1f, 0, 1f);
        PropertyValuesHolder pvhZ = PropertyValuesHolder.ofFloat("scaleY", 1f, 0, 1f);
        ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(mView, pvhX, pvhY, pvhZ).setDuration(2000);
        animator.start();
ObjectAnimator 使用
指定明确属性
        /**
         * 第二个参数  propertyName 介绍:
         * translationX 相对view自身开始X轴位移
         * translationY 相对view自身开始Y轴位移
         * x                在屏幕X轴像素开始位移
         * y                在屏幕Y轴像素开始位移
         * alpha            透明动画
         * rotation     相对view中心开始旋转
         * rotationX        相对view X轴开始旋转
         * rotationY        相对view Y轴开始旋转
         * scaleY           相对view Y轴开始缩放
         * scaleX           相对view X轴开始缩放
         */
        ObjectAnimator anim = ObjectAnimator.ofFloat(view, "rotation", 1.0F, 360F).setDuration(1000);
        anim.setRepeatCount(-1);
        anim.start();
// 由于ofFloat 是可变参数,我们也可以这样玩:
//      ObjectAnimator anim = ObjectAnimator.ofFloat(view, "alpha", 1.0f, 0.85f, 0.65f, 0.45f, 0.35f, 0.15f).setDuration(2000);
//      anim.start();
不指定明确属性
        /**
         * 即使在第二个参数,没有指定,属性动画的名称,我们还可以在animator.addUpdateListener,指定动画的类型
         * eg:
         *      Integer value= (Integer)animation.getAnimatedValue();
         *      view.setTranslationY(value);
         */
        ObjectAnimator animator=ObjectAnimator.ofInt(mView, "lxcay", 800);
        animator.addUpdateListener(new AnimatorUpdateListener() {

            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                Integer value= (Integer)animation.getAnimatedValue();
                mView.setAlpha(value);
                mView.setScaleX(value);
                mView.setScaleY(value);
                mView.setTranslationX(value);
                mView.setTranslationY(value);
            }
        });
        /**
         * 设置插值器,插值器,增加动画特效
         */
        animator.setInterpolator(new BounceInterpolator());  
        animator.setDuration(3000);  
        animator.start();

ValueAnimator 使用

不需要指定 propertyName 用法跟 ObjectAnimator 使用差不多,但是必须结合
animator.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {}
});
一起使用,不然无效;

        // 开始颜色为色
        int startColor = 0xffff0000;
        // 终止颜色为绿色
        int endColor = 0xff00ff00;
        ValueAnimator animator = ValueAnimator.ofArgb(startColor, endColor);
        animator.setTarget(mTextView);
        animator.addUpdateListener(new AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                int color = (Integer) animation.getAnimatedValue();
                mTextView.setBackgroundColor(color);
            }
        });
        animator.setDuration(3000);
        animator.start();
        DisplayMetrics outMetrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(outMetrics);
        int mScreenHeight = outMetrics.heightPixels;

        ValueAnimator animator = ValueAnimator.ofFloat(0, mScreenHeight - mView.getHeight() * 4);
        animator.setTarget(mBlueBall);
        animator.setDuration(1000).start();
        animator.setInterpolator(new OvershootInterpolator()/*AnimationUtils.loadInterpolator(this, android.R.anim.overshoot_interpolator)*/);
        animator.addUpdateListener(new AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                float value = (Float) animation.getAnimatedValue();
//              mBlueBall.setScaleX(value);
//              mBlueBall.setScaleY(value);
//              mBlueBall.setTranslationX(value);
//              mBlueBall.setAlpha(value);
                mBlueBall.setTranslationY(value);
            }
        });
删除动画
ObjectAnimator animation = ObjectAnimator.ofFloat(mBlueBall, "alpha", 0.5f);

        animation.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                Log.e(TAG, "onAnimationEnd");
                ViewGroup parent = (ViewGroup) mView.getParent();
                if (parent != null){
                    //删除动画
                    parent.removeView(mView);
                }
            }
        });
        animation.start();

3.1系统及以上:
ViewPropertyAnimator的使用
mTextView.animate().x(500).y(500).setDuration(5000).setInterpolator(new BounceInterpolator());
炒鸡简单,有木有!
虽然代码里面没有调用start(),但是在创建好动画后会在内部隐士调用。start();


全文参考自:
http://blog.csdn.net/guolin_blog/article/details/43536355
http://blog.csdn.net/guolin_blog/article/details/43816093
http://blog.csdn.net/guolin_blog/article/details/44171115

http://blog.csdn.net/lmj623565791/article/details/38067475
LayoutAnimations学习请看
http://blog.csdn.net/lmj623565791/article/details/38092093

https://developer.android.com/reference/android/animation/ObjectAnimator.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值