Android动画笔记

一.动画定义

1.View动画
定义:通过场景了的对象不断做图像变换(平移,缩放,旋转,透明度)从而产生动画效果,是一种渐进式动画。

2.帧动画
定义:(亦属View动画,表现形式不同)通过播放一系列图像从而产生动画效果。

3.属性动画
定义:通过动态改变对象的属性从而达到动画效果。

二.动画分类

1.View动画
1.1实现方式:
a: XML标签实现;
动画集合
android:interpolator: 插值器(影响动画的速度,比如非匀速动画需要通过插值器来控制动画的播放过程)
android:shareInterpolator: 表示集合中的动画是否和集合共享同一个插值器(如果集合不指定插值器,子动画标签需要单独指定所需的差值器或者默认值)

xml:

//<alpha>改变view透明度
//<translate>移动
//<rotate>旋转
//<scale>缩放
<set xmlns:android="http://schemas.android.com/apk/res/android"
     android:duration="800"
     android:interpolator="@android:anim/accelerate_decelerate_interpolator"
     android:shareInterpolator="true"
    >
    <translate
        android:fromYDelta="200"
        android:toYDelta="120"
        />
    <!--缩放起始值 fromXScale fromYScale-->
    <!--缩放的轴点 x,y坐标pivotX  pivotY(默认缩放为view的中心点)-->
    <scale
        android:fromXScale="1.2"
        android:fromYScale="1.2"
        android:toXScale="1"
        android:toYScale="1"
        />
        
    <!--旋转的开始角度,结束角度  fromDegrees  toDegrees-->
    <!--旋转的轴点 x,y pivotX pivotY(默认view左上角)-->
    <rotate
        android:fromDegrees="180"
        android:toDegrees="0"
        />

    <alpha
        android:fromAlpha="0"
        android:toAlpha="1"
        />

</set>

使用:

    Button button = findViewById(R.id.button);
    Animation animation =  AnimationUtils.loadAnimation(R.anim.animation_layout);
    button.startAnimation(animatioin);

b: Animation四个子类实现
(TranslateAnimation,ScaleAnimation,RotateAnimation,AlphaAnimation);
使用:

AlphaAnimation alphaAnimation =  new AlphaAnimation(0,1);
alphaAnimation.setDuration(100);
button.startAnimation(alphaAnimation);

可使用AnimationSet设置集合动画。

c: 自定义View动画,重写initialize(初始化工作)方法和applyTransformation(进行相应的矩阵变换)方法。

2.帧动画

2.1xml标签:

<animation-list> 
<item android:drawable="图片资源id" andorid:durationo="200">

使用AnimationDrawable类:

buttom.setBackgroundResource(R.drawable.animation_frame);
AnimationDrawable drawable = (AnimationDrawable) button.getBackground();
drawable.start();

**帧动画使用图片大小尽量要小,容易oom

3.属性动画

分类:
a.传统的(translation,scale,rotate,alpha)
b.view的(可显示且提供可改方法)属性。

实现方式:
a.ObjectAnimator

//动画默认时间为300ms
ValueAnimator objectAnimator = ObjectAnimator.ofFloat(mIvTranslation, "translationX",
        0, 700, 0);
objectAnimator.setDuration(5000);
objectAnimator.start();

b.xml标签

Animator animator1 = AnimatorInflater.loadAnimator(this,R.animator.value_single_xml);
animator1.setTarget(mIvXmlAnimationSet);
animator1.start();

value_single_xml.xml:

<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
                android:duration="1000"
                android:interpolator="@android:anim/accelerate_decelerate_interpolator"
                android:repeatCount="-1"
                android:repeatMode="reverse">
    <propertyValuesHolder
        android:propertyName="translationX"
        android:valueFrom="0"
        android:valueTo="500"
        />
</objectAnimator>

c.动画集合AnimatorSet

AnimatorSet animatorSet = new AnimatorSet();
animatorSet.playTogether(
        ObjectAnimator.ofFloat(mIvAnimationSet, "translationX",
                0, 700, 0),
        ObjectAnimator.ofFloat(mIvAnimationSet, "rotationX", 0, 360)
        , ObjectAnimator.ofFloat(mIvAnimationSet, "rotationX", 0, 360)
        , ObjectAnimator.ofFloat(mIvAnimationSet, "alpha", 0.5f, 1f, 0.5f, 1f)
);
animatorSet.setDuration(3000);
animatorSet.start();

xml动画集方式:

AnimatorSet animatorSet1 = (AnimatorSet) AnimatorInflater.
         loadAnimator(this, R.animator.value_anim_xml);
 animatorSet1.setTarget(mIvXmlAnimationSet);
 animatorSet1.start();

value_anim_xml.xml:

<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
                android:duration="1000"
                android:interpolator="@android:anim/accelerate_decelerate_interpolator"
                android:repeatCount="-1"
                android:repeatMode="reverse">
    <propertyValuesHolder
        android:propertyName="translationX"
        android:valueFrom="0"
        android:valueTo="500"
        />
</objectAnimator>

d.view可改属性动画(用法跟ObjectAnimator使用一样)

AnimatorSet animatorSet2 = new AnimatorSet();
//平移动画循环播放
ObjectAnimator animator = ObjectAnimator.ofFloat(mTvOrtherValueSet, "translationX",
        0, 700, 0);
animator.setRepeatCount(-1);
animator.setRepeatMode(ObjectAnimator.RESTART);
animatorSet2.playTogether(
        animator,
      /*  ObjectAnimator.ofInt(mTvOrtherValueSet, "background", //background需要xml可定义 但是没有公开设置方法不行
                R.color.gray,R.color.red,R.color.gray),*/
        ObjectAnimator.ofInt(mTvOrtherValueSet, "BackgroundColor",
                R.color.green,R.color.red,R.color.gray,R.color.green),
        ObjectAnimator.ofFloat(mTvOrtherValueSet, "textSize", 20, 30,20)
        , ObjectAnimator.ofFloat(mTvOrtherValueSet, "rotationY", 0, 360)
        , ObjectAnimator.ofFloat(mTvOrtherValueSet, "alpha", 0.5f, 1f, 0.5f, 1f)
);
animatorSet2.setDuration(3000);
animatorSet2.start();
三.View动画的特殊使用场景

1.LayoutAnimation
作用:为ViewGroup指定一个动画,子元素出场都会具有这种动画效果。
关键类:LayoutAnimation
示例:

<!--animationOrder 子元素动画顺序 正序 倒序 随机-->
<!--delay 每个子元素延时加载的时间:
每个子元素的加载周期的百分比(子duration="800",delay="1"那么延时时间为400ms)-->
<layoutAnimation
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:animation="@anim/anim_list_item"
    android:animationOrder="normal"
    android:delay="0.5"
    />

使用1:对应的ViewGroup标签里添加:

android:layoutAnimation="@anim/anim_list1"

使用2(LayoutAnimationController):

LayoutAnimationController layoutAnimationController = AnimationUtils.loadLayoutAnimation(this, R.anim.anim_list1);
layoutAnimationController.setDelay(0.8f);
layoutAnimationController.setOrder(LayoutAnimationController.ORDER_NORMAL);
mRv1.setLayoutAnimation(layoutAnimationController);

2.Activity转场动画
作用:Activity切换时的动画效果。
关键方法:overridePendingTransition
示例:

startActivity(AnimationActivity.class);
overridePendingTransition(R.anim.anim_activity_enter,R.anim.anim_activity_out);

注意的问题: overridePendingTransition方法必须在startActivity(intent)或者finish()之后调用才能生效。

3.Fragment转场动画
作用:Fragment切换时的动画效果。
关键方法:setCustomAnimations
示例:

FragmentTransaction transaction = childFragmentManager.beginTransaction();
transaction.setCustomAnimations(R.anim.anim_activity_enter,R.anim.anim_activity_out,R.anim.anim_activity_out,R.anim.anim_activity_out);

注意的问题: setCustomAnimations方法必须在rome(),add(),replace()方法调用之前调用,否则不起效果。

四.动画的插值器(Interpolator)和估值器(TypeEvaluator)

定义:
插值器:根据时间流逝的百分比来计算当前 属性值改变的百分比
估值器:根据当前 属性改变的百分比 计算改变后的属性值。

作用: 属性动画可以用来实现非匀速动画的。

系统提供
插值器:
LinearInterpolator(线性插值器,即实现匀速动画)
DecelerateInterpolator(减速插值器,实现动画越来越慢效果)
AccelerateDecelerateInterpolator(加速减速插值器,实现动画前后慢中间过程快的效果)
估值器:
IntEvaluator(整形估值器,针对属性值为整形)
FloatEvaluator(浮点型估值器,针对属性值为浮点型)
ArgbEvaluator(颜色估值器,针对属性值为Color)

自定义:
自定义插值器:需要实现Interpolator或者TimeInterpolator。

自定义估值器:需要实现TypeEvaluator。

当需要对其他类型(非int,float,Color)做动画,那么必须自定义类型估值算法。

五.属性动画的监听器

1.AnimatorUpdateListener接口

监听动画整个过程,动画由许多帧组成的,每播放一帧,onAnimatorUpdate就会被调用一次

 /**
     * Implementors of this interface can add themselves as update listeners
     * to an <code>ValueAnimator</code> instance to receive callbacks on every animation
     * frame, after the current frame's values have been calculated for that
     * <code>ValueAnimator</code>.
     */
    public static interface AnimatorUpdateListener {
        /**
         * <p>Notifies the occurrence of another frame of the animation.</p>
         *
         * @param animation The animation which was repeated.
         */
        void onAnimationUpdate(ValueAnimator animation);
    }

2.AnimatorListener接口

public static interface AnimatorListener {
    //当动画开始的时候调用.
    void onAnimationStart(Animator animation);
    //当动画结束的时候调用.
    void onAnimationEnd(Animator animation);
    //当动画取消的时候调用.(动画会结束 即调用结束方法)
    void onAnimationCancel(Animator animation);
    //动画重复播放时调用.
    void onAnimationRepeat(Animator animation);
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值