美文网首页
Android 动画详解。

Android 动画详解。

作者: 844b9a3a3a68 | 来源:发表于2017-05-22 12:04 被阅读73次

    总所周知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>
    
    

    相关文章

      网友评论

          本文标题:Android 动画详解。

          本文链接:https://www.haomeiwen.com/subject/xppbxxtx.html