Android动画

前提:
如果你想学习Android动画,知道它原理,实现什么的。如果你想掌握Android动画,熟练运用它什么的。那么可以看下面的几个我推荐的链接出门左转了~

  1. Android 属性动画(Property Animation) 完全解析 (上)
  2. Android 属性动画(Property Animation) 完全解析 (下)
  3. Android 属性动画 源码解析 深入了解其内部实现
  4. Android属性动画完全解析(上)
  5. Android属性动画完全解析(中)
  6. Android属性动画完全解析(下)

如果你想和我一样偷懒,或者你想知道这个坑货到底写了什么笔记,或者你想花几分钟重新复习一下Android动画基础,那么下面的内容应该很适合你(我)。

那么开始~

View动画

View动画的属性####
-set
    |-android:interpolator -> 插值器,影响动画的速度
        |-默认值 -> @android:anim/accelerate_decelerate_interpolator
    |-android:shareInterpolator -> 集合所有动画是否使用同一插值器
    |-android:fillAfter -> 动画结束后View是否停留在结束的位置
    |-android:startOffset -> 动画多少秒之后执行
    |-android:repeatMode -> 重复的模式,默认为restart,即重头开始重新运行,reverse即从结束开始向前重新运行
-TranslateAnimation -> 移动View
    |-<translate>
        |-android:fillAfter ->
        |-android:duration -> 表示动画持续的时间
        |-android:fromXDelta -> 表示 x 的起始值
        |-android:toXDelta -> 表示 x 的结束值
        |-android:fromYDelta -> 表示 y 的起始值
        |-android:toYDelta -> 表示 y 的结束值
-scaleAnimation -> 放大或者缩小View
    |-<scale>
        |-android:duration -> 表示动画持续的时间
        |-android:fromXScale -> 表示水平方向缩放的起始值
        |-android:fromYScale -> 表示竖直方向缩放的起始值
        |-android:pivotX -> 表示缩放中心点的 X 坐标
        |-android:pivotY -> 表示缩放中心点的 Y 坐标
        |-android:toXScale -> 表示水平方向缩放的结束值
        |-android:toYScale -> 表示竖直方向缩放的结束值
-RotateAnimation -> 旋转View
    |-<rotate>
        |-android:duration -> 表示动画持续的时间
        |-android:fromDegrees -> 旋转开始的角度
        |-android:toDegrees -> 旋转结束的角度
        |-android:pivotX -> 旋转中心点的 X 坐标
        |-android:pivotY -> 旋转中心点的 Y 坐标
-AlphaAnimation -> 改变View的透明度
    |-<alpha>
        |-android:duration -> 表示动画持续的时间
        |-android:fromAlpha -> 透明度的起始值
        |-android:toAlpha -> 透明度的结束值
-自定义View动画 -> (不会,待实践中学习)

View动画在XML中设置##

xml文件地址
res/anim/filename.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator" 
    android:shareInterpolator="true"
    android:fillAfter="true">

    <translate
        android:duration="100"
        android:fromXDelta="0.0f"
        android:fromYDelta="0.0f"
        android:toXDelta="100.0f"
        android:toYDelta="100.0f" />

    <scale
        android:fromXScale="0.0f"
        android:fromYScale="0.0f"
        android:pivotX="0.0f"
        android:pivotY="0.0f"
        android:toXScale="1.0f"
        android:toYScale="1.0f" />


    <rotate
        android:fromDegrees="0.0f"
        android:pivotX="0.0f"
        android:pivotY="0.0f"
        android:toDegrees="30.0f" />

    <alpha
        android:fromAlpha="0.0f"
        android:toAlpha="1.0f" />

</set>
View动画的使用####
View mView = findViewById(R.id.mView);
Animation mAnimation = AnimationUtils.loadAnimation(this,R.anim.slide_bottom_in);
mView.startAnimation(mAnimation);
View动画的在Java中设置并使用####
AlphaAnimation mAlphaAnimation = new AlphaAnimation(0 , 1);
mAlphaAnimation.setDuration(300);
mView.startAnimation(mAlphaAnimation);

mAlphaAnimation.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {
                //动画开始
            }

            @Override
            public void onAnimationEnd(Animation animation) {
                //动画结束
            }

            @Override
            public void onAnimationRepeat(Animation animation) {
                //动画重新运行
            }
        });

Frame动画

Frame动画的属性####
animation-list -> 帧动画列表
    |-android:oneshot -> true表示动画只播放一次停止在最后一帧上,false表示动画循环播放
    |-item -> 帧
        |-android:drawable -> 表示每一帧的值
        |-android:duration -> 表示每一帧停留的时间
Frame动画的XML设置####
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="true">
    <item android:drawable="@drawable/image1" android:duration="500" />
    <item android:drawable="@drawable/image2" android:duration="500" />
    <item android:drawable="@drawable/image3" android:duration="500" />
</animation-list>
Frame动画的使用####
mView.setBackgroundResource(R.drawable.frame);
AnimationDrawable mAnimationDrawable = (AnimationDrawable) mView.getBackground();
mAnimationDrawable.start();

Layout动画

Layout动画的属性####

LayoutAnimation -> 布局动画
    |-android:animation -> 孩子执行的动画资源
    |-android:animationOrder -> 子元素执行的顺序
        |-normal -> 顺序执行
        |-reverse -> 逆序执行
        |- 
    |-android:delay -> 子元素开始动画的延迟(每一个动画在上一个动画结束后延迟ms后执行)

Layout动画的XML设置####

<?xml version="1.0" encoding="utf-8"?>
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
    android:animation="@anim/slide_right"
    android:animationOrder="normal"
    android:delay="30%" />

Layout动画的使用####

<ListView
    android:layoutAnimation="@anim/list_anim"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

//通过加载XML动画设置文件来创建一个Animation对象;
Animation animation=AnimationUtils.loadAnimation(this, R.anim.list_anim);
//得到一个LayoutAnimationController对象;
LayoutAnimationController mLayoutAnimationController = new LayoutAnimationController(animation);
//设置控件显示的顺序;
mLayoutAnimationController.setOrder(LayoutAnimationController.ORDER_REVERSE);
//设置控件显示间隔时间;
mLayoutAnimationController.setDelay(1);
//为ListView设置LayoutAnimationController属性;
mList.setLayoutAnimation(mLayoutAnimationController);

Activity动画

Activity动画的属性####

overridePendingTransition(enterAnim, exitAnim);
    |-enterAnim -> 进入动画资源id, 0表示不使用
    |-exitAnim -> 退出动画资源id, 0表示不使用

Activity动画的使用方法####

Intent mIntent = new Intent(this, TestActivity.class);
startActivity(mIntent);
overridePendingTransition(R.anim.enter_anim, R.anim.exit_anim);

@Override
public void finish() {
    super.finish();
    overridePendingTransition(R.anim.enter_anim, R.anim.exit_anim);
}

PS:一定要在startActivity或者finishd的后面调用


Property动画

ObjectAnimator.ofFloat(mView, "translationY", 100).start();//默认时间内让mView在Y轴上平移100个像素

//3秒中内改变mView的背景颜色从0xffffffff到0xff000000
ValueAnimator colorAnim = ObjectAnimator.ofInt(mView, "backgroundColor", 0xffffffff, 0xff000000);
colorAnim.setDuration(3000);//动画执行时间
colorAnim.setEvaluator(new ArgbEvaluator());
colorAnim.setRepeatCount(ValueAnimator.INFINITE);//无限循环
colorAnim.setRepeatMode(ValueAnimator.REVERSE);//翻转执行
colorAnim.start();

//——–

AnimatorSet set = new AnimatorSet();
set.playTogether(
        ObjectAnimator.ofFloat(mView, "rotationX", 0, 360),
        ObjectAnimator.ofFloat(mView, "rotationY", 0, 180),
        ObjectAnimator.ofFloat(mView, "rotation", 0, 90),
        ObjectAnimator.ofFloat(mView, "translationX", 0, 90),
        ObjectAnimator.ofFloat(mView, "translationY", 0, 90),
        ObjectAnimator.ofFloat(mView, "scaleX", 1, 1.5f),
        ObjectAnimator.ofFloat(mView, "scaleY", 1, 1.5f),
        ObjectAnimator.ofFloat(mView, "alpha", 1, 1.5f, 1)
);
set.setDuration(5000).start();

PS:除了”rotationX”,”rotationY”,上面出现的这些可以使用,还有哪些可以用呢?
只要你的View有setXXX()方法就可以用。
比如View中有setAlpha(float value)getAlpha(),所以你就可以传入alpha了。

XML定义属性动画####

res/animator/property.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:ordering="sequentially">
    <objectAnimator
        android:duration="3000"
        android:propertyName="rotationX"
        android:repeatCount="infinite"
        android:repeatMode="reverse"
        android:startOffset="0"
        android:valueFrom="0"
        android:valueTo="360"
        android:valueType="intType" />

    <animator
        android:duration="3000"
        android:repeatCount="1"
        android:repeatMode="restart"
        android:startOffset="0"
        android:valueFrom="0"
        android:valueTo="100"
        android:valueType="intType" />

</set>

AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(getApplicationContext(), R.animator.property_animator);
set.setTarget(mView);
set.start();

<set>       =   AnimatorSet
<animator>  =   ValueAnimator
<objectAnimator>=   ObjectAnimator

objectAnimator
    |-android:propertyName  -> 表示属性动画作用的对象的属性的名称
    |-android:duration      -> 表示动画执行的时间
    |-android:repeatCount   -> 表示动画执行次数
    |-android:repeatMode    -> 表示动画执行类型
    |-android:startOffset   -> 表示动画执行延迟时间
    |-android:valueFrom     -> 表示属性执行初始值
    |-android:valueTo       -> 表示属性执行结束值
    |-android:valueType     -> 表示动画执行数值的类型

PS:属性动画设置生效的锚点是对View设置,例如修改锚点位置为View右上角:
mView.setPivotX(0f);
mView.setPivotY(mView.getWidth());

属性动画生效的前提:#####

1.对象必须提供 setXXX 方法(XXX为属性名称),还要提供有 getXXX 方法(如果你的动画没有传递初始值的话)。
2.对象的 setXXX 方法会对属性 XXX 进行某种UI改变,比如背景颜色。

问:属性动画生效怎么调用getXXX方法的?#####

答:反射


插值器和估值器

TimeInterpolator
    |-LinearInterpolator                -> 线性插值器,匀速运动
    |-AccelerateDecelerateInterpolator  -> 加速减速插值器,动画两头慢,中间快
    |-DecelerateInterpolator            -> 减速插值器,动画越来越慢
    |-more

TypeEvaluator
    |-IntEvaluator
    |-FloatEvaluator
    |-ArgbEvaluator -> 针对Color属性

Android L Animation
有待实践中学习(http://www.androiddesignpatterns.com/2014/12/activity-fragment-transitions-in-android-lollipop-part1.html

Android L Animation
    |-Touch feedback -> 触摸反馈
        |-Ripple -> 波纹效果
    |-Reveal effect -> 揭露效果
        |-ViewAnimationUtils.createCircularReveal() -> 创建方法
            |-centerX -> 动画执行中心 X 轴
            |-centerY -> 动画执行中心 Y 轴
            |-startRadius -> 动画开始的半径值
            |-endRadius -> 动画结束的半径值
    |-Transition -> 转换效果
        |-Activity transitions -> Activity转换效果
        |-TransitionManager
            |-(方法)beginDelayedTransition
                |-(参数)ViewGroup sceneRoot -> 根布局
                |-(参数)Transition transition -> 默认动画
                            |-Visibility -> View显示或者隐藏时候的动画效果
                                |-Explode -> 爆炸展开效果
                                |-Fade -> 渐变效果
                                |-Slide -> 滑动效果
    |-Curved motion -> 曲线运动 (待补充)
    |-View state changes -> 视图状态改变 (待补充)
    |-Animate Vector Drawables -> 可绘矢量动画 (待补充)

Ripple (波纹效果)####
android:colorControlHighlight="#ff00ff" //波纹颜色
android:colorAccent="#ffff00" //设置checkbox等控件的选中颜色
android:background="?android:attr/selectableItemBackground" //波纹有边界
android:background="?android:attr/selectableItemBackgroundBorderless" //波纹超出边界

Circular Reveal (揭露效果)####
mButton = findViewById(R.id.mButton);
mButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Animator animator = ViewAnimationUtils.createCircularReveal(
                mButton,
                0,
                0,
                0,
                (float) Math.hypot(mButton.getWidth(), mButton.getHeight()));
        animator.setInterpolator(new AccelerateInterpolator());
        animator.setDuration(2000);
        animator.start();
    }
});

使用注意问题####
1.OOM问题
帧动画使用图片过大容易OOM。

2.内存泄漏
当有些属性动画是无限运行的,比如转圈~,这类动画要在Activity的onPause()中及时暂停!

3.是用View动画后无法隐藏
setVisibility(View.GONE)失效,使用clearAnimation()消除View动画。

4.点击问题
View动画新位置无法触发点击事件,属性动画旧位置无法触发点击事件。(版本也有些区别,需要注意)

Whitelaning
It’s very easy to be different but very difficult to be better

    </div>
    <!--  -->

    <div class="show-foot">
      <a class="notebook" href="/nb/3563402">
        <i class="iconfont ic-search-notebook"></i>
        <span>Android文集</span>




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值