Android动画

ObjectAnimator

    TextView mTextView = (TextView) findViewById(R.id.tv);


        //objectAnimator

        //alpha
        //rotation
        //scaleX
        //translationX

//      ObjectAnimator animator1 = ObjectAnimator.ofFloat(mTextView, "alpha", 0f, 1f, 0f, 1f); // 透明度变换
//      ObjectAnimator animator1 = ObjectAnimator.ofFloat(mTextView, "rotation", 0f, 360f);  // 旋转
//      ObjectAnimator animator1 = ObjectAnimator.ofFloat(mTextView, "scaleX", 1f, 2f, 1f);  //缩放X
        //  当前X的位置
        float currentX = mTextView.getTranslationX();
        ObjectAnimator animator1 = ObjectAnimator.ofFloat(mTextView, "translationX", currentX, -500f, currentX); //  位移X
        animator1.setDuration(5000);
        animator1.start();

组合动画 AnimatorSet

AnimatorSet set = new AnimatorSet();
        ObjectAnimator animator2 = ObjectAnimator.ofFloat(mTextView, "alpha", 0f, 1f, 0f, 1f); // 透明度变换
        ObjectAnimator animator3 = ObjectAnimator.ofFloat(mTextView, "rotation", 0f, 360f);  // 旋转
        ObjectAnimator animator4 = ObjectAnimator.ofFloat(mTextView, "scaleX", 1f, 2f, 1f);  //缩放X
        set.play(animator2).with(animator3).after(animator4);  // 同时播放animator2和animator3,在animator4之后
        set.setDuration(5000);
        set.start();

Animator 监听

所有继承animator的类都可以添加这个监听。

set.addListener(new AnimatorListener() {

            @Override
            public void onAnimationStart(Animator animation) {
                Log.v("TAG", "/// onAnimationStart");

            }

            @Override
            public void onAnimationRepeat(Animator animation) {
                Log.v("TAG", "/// onAnimationRepeat");

            }

            @Override
            public void onAnimationEnd(Animator animation) {
                Log.v("TAG", "/// onAnimationEnd");

            }

            @Override
            public void onAnimationCancel(Animator animation) {
                Log.v("TAG", "/// onAnimationCancel");

            }
        });

XML编写动画

1.在res目录下新建animator文件夹
2.使用xml编写动画可以重复使用

animator1.xml

<objectAnimator 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="5000"
    android:propertyName="alpha"
    android:valueType="floatType"
    android:valueFrom="0f"
    android:valueTo="1f"
    >

</objectAnimator>

Activity

TextView mTextView = (TextView) findViewById(R.id.tv);
Animator animator = AnimatorInflater.loadAnimator(this, R.animator.animator1);
        animator.setTarget(mTextView);
        animator.start();

复杂的动画 XML

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:ordering="sequentially" >

    <!-- sequentially == 连续 -->
    <objectAnimator
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="5000"
        android:propertyName="alpha"
        android:valueFrom="0f"
        android:valueTo="1f"
        android:valueType="floatType" >

        <set android:ordering="together" >
            <!-- together == 一起 -->
            <objectAnimator
                xmlns:android="http://schemas.android.com/apk/res/android"
                android:duration="2500"
                android:propertyName="rotation"
                android:valueFrom="0f"
                android:valueTo="360f"
                android:valueType="floatType" />
            <objectAnimator
                xmlns:android="http://schemas.android.com/apk/res/android"
                android:duration="2500"
                android:propertyName="translationX"
                android:valueFrom="0f"
                android:valueTo="100f"
                android:valueType="floatType" />
        </set>
    </objectAnimator>

</set>

转载于:
http://blog.csdn.net/guolin_blog/article/details/43536355


TypeEvalutor

地址:http://blog.csdn.net/guolin_blog/article/details/43816093


Interpolator

地址:http://blog.csdn.net/guolin_blog/article/details/44171115


2016/08/03更新

View动画(Tween,补间动画)

1.xml控制(可以复用, 可读性好)
2.代码控制(代码量少)


    <!-- 平移 -->
    <translate 
        android:fromXDelta="-100"
        android:toXDelta="800"
        android:fromYDelta="-100"
        android:toYDelta="400"
        android:duration="3000"/>

这里的fromXDelta和toXDelta等都是指相对于View的距离,并不是绝对的X,Y坐标。正值代表方向是右边或下边,负值代表方向是左边或上边


<set xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 平移 -->
     <translate 
        android:fromXDelta="-100"
        android:toXDelta="800"
        android:fromYDelta="-100"
        android:toYDelta="400"
        android:duration="3000"/> 

    <!-- 旋转 ,以自身中心为原点 -->
    <!--pivotX 和 pivotY 都等于0, 则旋转中心为View的左上角 -->
    <rotate
        android:fromDegrees="0"
        android:toDegrees="359"
        android:duration="6000"
        android:pivotX="50%"
        android:pivotY="50%"
        />
</set>

在同一个动画集合里,动画效果是同步执行的。如果使用上述这种动画集合,View不会自我旋转。因为当动画开始时已经确定了旋转中心,而平移效果也开始了,所以集合起来的效果就是View围绕了原来的自身中心点旋转。


缩放Scale:
fromYScale = “float”
fromXScale = “float”
toYScale = “float”
toXScale = “float”
pivotX = “float”
pivotY = “float”

透明度alpha
fromAlpha = “float”
toAlpha = “float”

fillAfter = boolean ,动画结束后View是否停留在结束位置。


使用XML定义的动画集合

    Animation animation = AnimationUtils.loadAnimation(this, R.anim.anim);
    // 设置动画监听
        animation.setAnimationListener(new AnimationListener() {

            @Override
            public void onAnimationStart(Animation animation) {
                Log.d("MyTAG", "start");
            }

            @Override
            public void onAnimationRepeat(Animation animation) {
                Log.d("MyTAG", "repeat");
            }

            @Override
            public void onAnimationEnd(Animation animation) {
                Log.d("MyTAG", "end");              
            }
        });
        mIv1.startAnimation(animation);

有序执行动画

错误做法:

mIv1.startAnimation(AnimationUtils.loadAnimation(this, R.anim.anim));
        mIv1.startAnimation(AnimationUtils.loadAnimation(this, R.anim.anim2));

这种做法会导致anim不执行,直接执行anm2。

正确做法:
android:startOffset = “3000”,表示该动画延迟3000毫秒执行。

<set xmlns:android="http://schemas.android.com/apk/res/android"

    >
    <!-- 平移 -->
     <translate 
        android:fromXDelta="-100"
        android:toXDelta="800"
        android:fromYDelta="-100"
        android:toYDelta="400"
        android:duration="3000"/> 

    <!-- 旋转 ,以自身中心为原点 -->
    <!--pivotX 和 pivotY 都等于0, 则旋转中心为View的左上角 -->
    <rotate
        android:startOffset="3000"
        android:fromDegrees="0"
        android:toDegrees="359"
        android:duration="6000"
        android:pivotX="50%"
        android:pivotY="50%"
        />
</set>

使用代码创建动画

AlphaAnimation alphaAnimation = new AlphaAnimation(1, 0);
        alphaAnimation.setDuration(2000);
        // View保持动画结束后的效果
        alphaAnimation.setFillAfter(true);
        mIv1.startAnimation(alphaAnimation);

帧动画

使用场景少,暂无研究。


LayoutAnimation, 作用于ViewGroup,这样当它的子元素出场时都带有特定的动画效果。

LayoutAnimation同样有xml和代码2种方式设置。

<layoutAnimation
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:delay="0.5"
    android:animationOrder="normal"
    android:animation="@anim/anim"
  />

delay:子元素开始动画的时间延迟,比如子元素的入场动画周期为300ms,则0.5代表每个子元素都要延迟150ms。总的来说,即第一个子元素延迟150ms,第二个子元素延迟300ms,以此类推。

animationOrder:子元素入场方式,normal顺序,reverse逆序,random随机。

animation:动画集合

使用方式:

xml

<ViewGroup 
android:layoutAnimation = "@anim/layoutanim" />

代码

LayoutAnimationController controller = new LayoutAnimationController(animation);
        controller.setDelay(0.5f);
        controller.setOrder(LayoutAnimationController.ORDER_NORMAL);
        ViewGroup.setLayoutAnimation(controller);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值