Android 动画详解。

总所周知Android动画分为3类:

一、Frame Animation:(逐帧动画)一帧帧的播放图片,利用人眼视觉残留原理,给我们带来动画的感觉。它的原理的GIF图片、电影播放原理一样。

主要用于播放一帧帧准备好的图片,类似GIF图片,优点是使用简单方便、缺点是需要事先准备好每一帧图片;

二、Tween Animation:(补间动画)补间动画就是我们只需指定开始、结束的“关键帧“,而变化中的其他帧由系统来计算,不必自己一帧帧的去定义。

仅需定义开始与结束的关键帧,而变化的中间帧由系统补上,优点是不用准备每一帧,缺点是只改变了对象绘制,而没有改变View本身属性。因此如果改变了按钮的位置,还是需要点击原来按钮所在位置才有效。

三、Property Animation:(属性动画) 属性动画只对Android 3.0(API 11)以上版本的Android系统才有效,这种动画可以设置给任何Object,包括那些还没有渲染到屏幕上的对象。这种动画是可扩展的,可以让你自定义任何类型和属性的动画。

是3.0后推出的动画,优点是使用简单、降低实现的复杂度、直接更改对象的属性、几乎可适用于任何对象而仅非View类,缺点是需要3.0以上的API支持,限制较大!但是目前国外有个开源库,可以提供低版本支持!

Frame Animation:(逐帧动画):

特别注意,AnimationDrawable的start()方法不能在Activity的onCreate方法中调运,因为AnimationDrawable还未完全附着到window上,所以最好的调运时机是onWindowFocusChanged()方法中。
<!-- 注意:rocket.xml文件位于res/drawable/目录下 -->
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot=["true" | "false"] >
    <item
        android:drawable="@[package:]drawable/drawable_resource_name"
        android:duration="integer" />
</animation-list>
ImageView rocketImage = (ImageView) findViewById(R.id.rocket_image);
rocketImage.setBackgroundResource(R.drawable.rocket_thrust);

rocketAnimation = (AnimationDrawable) rocketImage.getBackground();
rocketAnimation.start();

Tween(补间)动画:

java类名              xml关键字                      描述信息
AlphaAnimation      <alpha>             放置在res/anim/目录下 渐变透明度动画效果
RotateAnimation     <rotate>            放置在res/anim/目录下 画面转移旋转动画效果
ScaleAnimation      <scale>             放置在res/anim/目录下 渐变尺寸伸缩动画效果
TranslateAnimation  <translate>         放置在res/anim/目录下 画面转换位置移动动画效果
AnimationSet        <set>               放置在res/anim/目录下 一个持有其它动画元素alpha、scale、translate、rotate或者其它set元素的容器
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@[package:]anim/interpolator_resource"
    android:shareInterpolator=["true" | "false"] >
    <alpha
        android:fromAlpha="float"
        android:toAlpha="float" />
    <scale
        android:fromXScale="float"
        android:toXScale="float"
        android:fromYScale="float"
        android:toYScale="float"
        android:pivotX="float"
        android:pivotY="float" />
    <translate
        android:fromXDelta="float"
        android:toXDelta="float"
        android:fromYDelta="float"
        android:toYDelta="float" />
    <rotate
        android:fromDegrees="float"
        android:toDegrees="float"
        android:pivotX="float"
        android:pivotY="float" />
    <set>
        ...
    </set>
</set>
ImageView spaceshipImage = (ImageView) findViewById(R.id.spaceshipImage);
Animation hyperspaceJumpAnimation = AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump);
spaceshipImage.startAnimation(hyperspaceJumpAnimation);

Property Animation:(属性动画):

XML方式属性动画:

在xml中可直接用的属性动画节点有ValueAnimator、ObjectAnimator、AnimatorSet。

XML属性动画使用方法:

AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(myContext,
    R.animtor.property_animator);
set.setTarget(myObject);
set.start();

Java方式属性动画:

ObjectAnimator.ofFloat(view, "rotationY", 0.0f, 360.0f).setDuration(1000).start();
ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f);  
anim.setDuration(300);  
anim.start(); 
myView.animate().x(0f).y(100f).start(); 

属性动画综合案例:

        ValueAnimator anim = ValueAnimator.ofInt(0, 500);
        anim.setDuration(5000);
        anim.setTarget(tv);
        anim.setStartDelay(1000);
        anim.setRepeatCount(ObjectAnimator.INFINITE);
        anim.setRepeatMode(ObjectAnimator.REVERSE);
        anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                int currentValue = (int) animation.getAnimatedValue();
                Log.d("TAG", "cuurent value is " + currentValue);
                tv.layout(currentValue, currentValue * 2,
                currentValue + tv.getWidth(),
                currentValue * 2 + tv.getHeight());
            }
        });
        anim.addListener(new AnimatorListener() {
            @Override
            public void onAnimationStart(Animator animation) {
                Log.d("TAG", "动画开始");
            }

            @Override
            public void onAnimationRepeat(Animator animation) {
                Log.d("TAG", "动画重复");
            }

            @Override
            public void onAnimationEnd(Animator animation) {
                Log.d("TAG", "动画结束");
            }

            @Override
            public void onAnimationCancel(Animator animation) {
                Log.d("TAG", "动画取消");
            }
        });
        // anim.start();
        ValueAnimator anim2 = ValueAnimator.ofInt(0, 255);
        anim2.setDuration(2000000);
        anim2.setTarget(tv);
        anim2.setStartDelay(1000);
        anim2.setRepeatCount(ObjectAnimator.INFINITE);
        anim2.setRepeatMode(ObjectAnimator.REVERSE);
        anim2.addUpdateListener(new AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                int currentValue = (int) animation.getAnimatedValue();
                tv.setAlpha(currentValue / 255);
            }
        });
        AnimatorSet animSet = new AnimatorSet();
        // with,随着,after,后,before之前
        animSet.play(anim).with(anim2);
        animSet.setDuration(5000);
        animSet.start();
        // anim.cancel();//取消
        // removeListener(AnimatorListenerlistener)用于在animator中移除指定的监听器
        // 而removeAllListeners()用于移除animator中所有的AnimatorListener监听器
        // 克隆一个新的ValueAnimator,然后开始动画
        // ValueAnimator newAnimator = anim.clone();
        // newAnimator.setStartDelay(1000);
        // newAnimator.start();

Activity切换动画:


    @Override//跳转动画
    public void startActivity(Intent intent) {
        super.startActivity(intent);
        第一个参数是进入第2个Activity(即第二个Activity)的动画,第二个参数是第一个Activity离开时候的动画(即第一个Activity的动画)
        overridePendingTransition(R.anim.left_right_in,R.anim.left_right_out);
    }

    @Override//关闭动画
    public void finish() {
        super.finish();
        overridePendingTransition(R.anim.left_right_in,R.anim.left_right_out);
        AppManager.getInstance().removeActivity(this);
    }

Fragment切换动画:

    /**
     * 切换视图
     * 
     * @param fragment
     */
    public void switchFragment(Fragment fragment) {
        getSupportFragmentManager()
                .beginTransaction()
                .setCustomAnimations(R.anim.left_right_in,
                        R.anim.left_right_out)
                .replace(R.id.fl_content, fragment).commit();
    }

res目录下新建anim目录,新建上面用到的动画xml:

left_right_in.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate 
        android:duration="300" 
        android:fromXDelta="-100%"
        android:fromYDelta="0"
        android:interpolator="@android:anim/decelerate_interpolator"
        android:toXDelta="0"
        android:toYDelta="0" />
</set>

left_right_out.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="300"
        android:fromXDelta="0"
        android:fromYDelta="0"
        android:interpolator="@android:anim/decelerate_interpolator"
        android:toXDelta="100%"
        android:toYDelta="0" />
</set>

right_left_in.xml:

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

    <translate
        android:duration="300"
        android:fromXDelta="100%"
        android:fromYDelta="0"
        android:interpolator="@android:anim/decelerate_interpolator"
        android:toXDelta="0"
        android:toYDelta="0" />

</set>

right_left_out.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="300"
        android:fromXDelta="0"
        android:fromYDelta="0"
        android:interpolator="@android:anim/decelerate_interpolator"
        android:toXDelta="-100%"
        android:toYDelta="0"
        />

</set>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值