精华内容
下载资源
问答
  • 动画文本程序

    2015-02-26 09:44:12
    能够让文本动画一样动起来。可以设置动画方式,文字的格式、颜色等内容
  • 这是一在您的网站上获取动画文本的方法。 首先在这个地址获得第一个视图 这是一让您的文本变得生动、在您想要时制作动画或通过鼠标悬停创建事件的方法。 这很容易部署,一旦你添加了 dytext.js,你只需要在 div...
  • 实现Activity跳转动画的五种方式

    千次阅读 2017-12-18 11:26:20
    文本中我们将讲解activity切换动画相关的知识点,这里的切换动画指的是是activity跳转时的动画效果。这里总结了一下,有五种方式实现activity切换时实现动画效果。下面我将依次介绍一下每实现activity切换动画效果...

    文本中我们将讲解activity切换动画相关的知识点,这里的切换动画指的是是activity跳转时的动画效果。这里总结了一下,有五种方式实现activity切换时实现动画效果。下面我将依次介绍一下每种实现activity切换动画效果的实现方式。

    在介绍activity的切换动画之前我们先来说明一下实现切换activity的两种方式:

    • 调用startActivity方法启动一个新的Activity并跳转其页面

    • 调用finish方法销毁当前的Activity返回上一个Activity界面

    当调用startActivity方法的时候启动一个新的activity,这时候就涉及到了旧的Activity的退出动画和新的Activity的显示动画; 
    当调用finish方法的时候,销毁当前Acitivity,就涉及到了当前Activity的退出动画和前一个Activity的显示动画;

    所以我们的activity跳转动画是分为两个部分的:一个Activity的销毁动画与一个Activity的显示动画,明白了这一点之后我们开始看一下第一种实现Activity跳转动画的方式:通过overridePendingTransition方法实现Activity切换动画。

    (一)使用overridePendingTransition方法实现Activity跳转动画

    overridePendingTransition方法是Activity中提供的Activity跳转动画方法,通过该方法可以实现Activity跳转时的动画效果。下面我们就将通过一个简单的例子看一下如何通过overridePendingTransition方法实现Activity的切换动画。

    demo例子中我们实现了Activity a中有一个点击按钮,点击按钮实现跳转Activity b的逻辑,具体代码如下:

    /**
     * 点击按钮实现跳转逻辑
     */
    button1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    /**
                     * 在调用了startActivity方法之后立即调用overridePendingTransition方法
                     */
                    Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                    startActivity(intent);
                    overridePendingTransition(R.anim.slide_in_left, R.anim.slide_in_left);
                }
            });
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    可以看到我们在调用了startActivity方法之后又执行了overridePendingTransition方法,而在overridePendingTransition方法中传递了两个动画布局文件,我们首先看一下这里的动画文件具体是怎么实现的:

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:shareInterpolator="false"
        Android:zAdjustment="top">
        <translate
            Android:duration="200"
            Android:fromXDelta="-100.0%p"
            Android:toXDelta="0.0" />
    </set>
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    这里的overridePendingTransition方法传递的是两个动画文件id,第一个参数是需要打开的Activity进入时的动画,第二个参数是需要关闭的Activity离开时的动画。这样我们执行了这段代码之后在跳转Activity的时候就展示了动画效果: 
    这里写图片描述

    动画的效果是通过overridePendingTransition方法实现的,那么下面我们来看一下overridePendingTransition方法的定义,我们在overridependingTransition方法在定义的时候有这样的一段注释说明:

    /**
     * Call immediately after one of the flavors of {@link #startActivity(Intent)}
     * or {@link #finish} to specify an explicit transition animation to
     * perform next.
     */
    
    /**
     * @param enterAnim A resource ID of the animation resource to use for
     * the incoming activity.  Use 0 for no animation.
     * @param exitAnim A resource ID of the animation resource to use for
     * the outgoing activity.  Use 0 for no animation.
     */
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    好吧,这段注释,告诉通过注释我们能够知道:

    • overridePendingTransition方法需要在startAtivity方法或者是finish方法调用之后立即执行

    • 参数enterAnim表示的是从Activity a跳转到Activity b,进入b时的动画效果

    • 参数exitAnim表示的是从Activity a跳转到Activity b,离开a时的动过效果

    • 若进入b或者是离开a时不需要动画效果,则可以传值为0

    好吧,本着批判的精神,我们来看一下是不是这样的,首先看一下如果我们在startActivity方法调用之后不立即执行overridePendingTransition方法,会有动画效果么?

    若我们将overridePendingTransition延时1s执行呢?

    /**
     * 点击按钮实现跳转逻辑
     */
    button1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                    startActivity(intent);
                    overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_left);
                    /**
                     * 延时1s执行overridePendingTransition方法
                     */
                    button1.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            overridePendingTransition(R.anim.slide_in_top, R.anim.slide_in_top);
                        }
                    }, 1000);
    
                }
            });
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    好吧,执行之后我们能够发现跳转动画没有了,所以overridePendingTransition只能在startActivity或者是finish方法之后执行。

    还有一个问题,如果是在startActivity之后执行,只是在子线程中执行呢?activity的跳转动画能够执行么?

    /**
     * 点击按钮实现跳转逻辑
     */
    button1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                    startActivity(intent);
                    overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_left);
                    /**
                     * 在子线程中执行overridePendingTransition方法
                     */
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_left);
                        }
                    }).start();
    
                }
            });
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    好吧,你没有猜错,activity的切换效果还是执行,也就是说overridePendingTransition方法也是可以在子线程中执行的,当然这并没什么卵用。

    好吧,在介绍完了使用overridePendingTransition方法实现Activity切换动画之后我们下面看一下使用style的方式定义实现Activity的切换动画。

    (二)使用style的方式定义Activity的切换动画

    (1)定义Application的style

    <!-- 系统Application定义 -->
    <application
            Android:allowBackup="true"
            Android:icon="@mipmap/ic_launcher"
            Android:label="@string/app_name"
            Android:supportsRtl="true"
            Android:theme="@style/AppTheme">
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    (2)定义具体的AppTheme样式

    其中这里的windowAnimationStyle就是我们定义Activity切换动画的style。而@anim/slide_in_top就是我们定义的动画文件,也就是说通过为Appliation设置style,然后为windowAnimationStyle设置动画文件就可以全局的为Activity的跳转配置动画效果。

    <!-- Base application theme. -->
        <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
            <!-- Customize your theme here. -->
            <item name="colorPrimary">@color/colorPrimary</item>
            <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
            <item name="colorAccent">@color/colorAccent</item>
            <item name="Android:windowAnimationStyle">@style/activityAnim</item>
        </style>
    
    
    <!-- 使用style方式定义activity切换动画 -->
        <style name="activityAnim">
            <item name="Android:activityOpenEnterAnimation">@anim/slide_in_top</item>
            <item name="Android:activityOpenExitAnimation">@anim/slide_in_top</item>
        </style>
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    而在windowAnimationStyle中存在四种动画:

    activityOpenEnterAnimation // 用于设置打开新的Activity并进入新的Activity展示的动画
    activityOpenExitAnimation  // 用于设置打开新的Activity并销毁之前的Activity展示的动画
    activityCloseEnterAnimation  // 用于设置关闭当前Activity进入上一个Activity展示的动画
    activityCloseExitAnimation  // 用于设置关闭当前Activity时展示的动画
     
    • 1
    • 2
    • 3
    • 4

    (3)测试代码,实现activity切换操作

    /**
             * 点击按钮,实现Activity的跳转操作
             * 通过定义style的方式实现activity的跳转动画
             */
            button2.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    /**
                     * 普通的Intent跳转Activity实现
                     */
                    Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                    startActivity(intent);
                }
            });
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    这时候我们我们执行diamante逻辑之后就能发现activity在切换的时候出现了动画效果,说明我们设置的style起作用了。

    (三)使用ActivityOptions切换动画实现Activity跳转动画

    上面我们讲解的通过overridePendingTransition方法基本上可以满足我们日常中对Activity跳转动画的需求了,但是MD风格出来之后,overridePendingTransition这种老旧、生硬的方式怎么能适合我们的MD风格的App呢?好在google在新的sdk中给我们提供了另外一种Activity的过度动画——ActivityOptions。并且提供了兼容包——ActivityOptionsCompat。ActivityOptionsCompat是一个静态类,提供了相应的Activity跳转动画效果,通过其可以实现不少炫酷的动画效果。

    (1)在跳转的Activity中设置contentFeature

    @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            // 设置contentFeature,可使用切换动画
            getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
            Transition explode = TransitionInflater.from(this).inflateTransition(Android.R.transition.explode);
            getWindow().setEnterTransition(explode);
    
            setContentView(R.layout.activity_three);
        }
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    这里我们在Activity的setContentView之前调用了:

    getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
     
    • 1

    方法,看过我的Activity布局加载流程的同学应该知道,这里的setFeature就是为activity的窗口设置特性,不同的特性对应不同的布局方式,比如可以设置无toolbar模式,有toolbar模式等等。而这里设置的是需要过渡动画,并且我们获取了Android中内置的explode动画,并设值给了Activity的window窗口对象,这样当Activity被启动的时候就会执行explode所带便的动画效果了。

    (2)在startActivity执行跳转逻辑的时候调用startActivity的重写方法,执行ActivityOptions.makeSceneTransitionAnimation方法

    /**
             * 点击按钮,实现Activity的跳转操作
             * 通过Android5.0及以上代码的方式实现activity的跳转动画
             */
            button3.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(MainActivity.this, ThreeActivity.class);
                    startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(MainActivity.this).toBundle());
                }
            });
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    这里我们调用了startActivity的重载方法:

    public void startActivity(Intent intent, @Nullable Bundle options)
     
    • 1

    并且我们传入了ActivityOptions.makeSceneTransitionAnimation,该方法表示将Activity a平滑的切换到Activity b,其还有几个重载方法可以指定相关的View,即以View为焦点平滑的从Activity a切换到Activity b。

    调用这段代码之后我们activity跳转的时候就展示出了动画效果。 
    这里写图片描述

    (四)使用ActivityOptions之后内置的动画效果通过style的方式

    这种方式其实就是通过style的方式展示和使用ActivityOptions过度动画,下面是实现通过定义style方式定义过度动画的步骤:

    (1)编写过度动画文件

    <explode xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:duration="300" />
     
    • 1
    • 2

    首先我们需要在Application项目res目录下新建一个transition目录,然后创建资源文件,然后使用这些系统自带的过渡动画效果,这里设置了过度时长为300ms。

    (2)定义style文件

    <!-- Base application theme. -->
        <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
            <!-- Customize your theme here. -->
            <item name="colorPrimary">@color/colorPrimary</item>
            <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
            <item name="colorAccent">@color/colorAccent</item>
    
            <item name="Android:windowEnterTransition">@transition/activity_explode</item>
            <item name="Android:windowExitTransition">@transition/activity_explode</item>
        </style>
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在Application的style文件中添加:

    <item name="Android:windowEnterTransition">@transition/activity_explode</item>
            <item name="Android:windowExitTransition">@transition/activity_explode</item>
     
    • 1
    • 2

    并指定过渡动画效果为我们刚刚定义的过渡动画文件。

    (3)执行跳转逻辑

    /**
             * 点击按钮,实现Activity的跳转操作
             * 通过Android5.0及以上style的方式实现activity的跳转动画
             */
            button4.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    /**
                     * 调用ActivityOptions.makeSceneTransitionAnimation实现过度动画
                     */
                    Intent intent = new Intent(MainActivity.this, FourActivity.class);
                    startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(MainActivity.this).toBundle());
                }
            });
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    这样执行之后也可以展示出Activity跳转过度动画了,其和通过代码方式实现的效果是类似的,而且这种动画效果是全局的。

    (五)使用ActivityOptions动画共享组件的方式实现跳转Activity动画

    这里的共享组件动画效果是指将前面一个Activity的某个子View与后面一个Activity的某个子View之间有过渡效果,即在这种过度效果下实现Activity的跳转操作。那么如何实现两个组件View之间实现过渡效果呢?

    (1)定义共享组件

    在Activity a中的button按钮点击transitionName属性:

    <Button
            Android:id="@+id/button5"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:layout_below="@+id/button4"
            Android:layout_marginTop="10dp"
            Android:layout_marginRight="10dp"
            Android:layout_marginLeft="10dp"
            Android:text="组件过度动画"
            Android:background="@color/colorPrimary"
            Android:transitionName="shareNames"
            />
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在Activity b的布局文件中为组件定义transitionName属性,这样这两个组件相当于有了过度对应关系,这里需要注意的是这两个组件的transitionName属性的值必须是相同的。

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:id="@+id/activity_second"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:gravity="center_horizontal"
        Android:orientation="vertical"
        Android:transitionName="shareNames"
        >
    
        <TextView
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:background="@color/colorAccent"
            Android:layout_marginTop="10dp"
            Android:layout_marginBottom="10dp"
            />
    
    
    </LinearLayout>
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    (2)调用startActivity执行跳转动画

    /**
             * 点击按钮,实现Activity的跳转操作
             * 通过Android5.0及以上共享组件的方式实现activity的跳转动画
             */
            button5.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(MainActivity.this, FiveActivity.class);
                    startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(MainActivity.this, button5, "shareNames").toBundle());
                }
            });
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    需要说明的是这里调用的ActivityOptions.makeSceneTransitionAnimation方法,传递了三个参数,其中第一个参数为context对象,第二个参数为启动Activity的共享组件,第三个参数为启动Activity的共享组件transitionName属性值。

    这样经过调用之后我们就实现了从Activity a跳转到Activity b的时候a中的组件到b中组件的过度效果。 
    这里写图片描述

    总结:

    • 本文主要讲解了通过overridePendingTransition方式和ActivityOptions动画API实现Activity的切换动画效果;

    • overridePendingTransition方法从Android2.0开始,基本上能够覆盖我们activity跳转动画的需求;

    • ActivityOptions API是在Android5.0开始的,可以实现一些炫酷的动画效果,更加符合MD风格;

    • ActivityOptions还可以实现两个Activity组件之间的过度动画;

    • 本项目例子已上传待github中,欢迎star和follow,项目地址:实现activity跳转动画的五种方式

    展开全文
  • 文本中我们将讲解activity切换动画相关的知识点,这里的切换动画指的是是activity跳转时的动画效果。这里总结了一下,有五种方式实现activity切换时实现动画效果。下面我将依次介绍一下每实现activity切换动画效果...

    转载请标明出处:一片枫叶的专栏

    上一篇文章中我们讲解了在Activity启动过程中获取组件宽高的五种方式。在Activity的启动过程中如果我们直接在生命周期方法中通过view.getWidth()或者是view.getHeight()方法获取组件的宽度和高度其结果都是0,为什么会出现这个问题呢?

    其实看过我以前写过的Activity启动流程  Activity布局加载流程  Activity布局绘制流程  的同学应该对Activity的启动流程和其布局加载绘制流程不陌生,Activity的启动流程和Activity的布局文件加载绘制流程,其实没有相关的关系的,其实两个异步的加载流程,这样我们在Activity的onCreate或者是onResume方法中调用textView.getHeight()或者是textView.getWidth()方法的时候,Activity对应的组件并没有执行完绘制流程,因此此时获取到的组件的宽高都是默认的0,所以这时候通过getWidth()和getHeight()方法也就是无法获取组件的宽和高了。

    更多关于在Activity启动过程中获取组件宽高的知识,可参考我的:Activity启动过程中获取组件宽高的N种方式

    文本中我们将讲解activity切换动画相关的知识点,这里的切换动画指的是是activity跳转时的动画效果。这里总结了一下,有五种方式实现activity切换时实现动画效果。下面我将依次介绍一下每种实现activity切换动画效果的实现方式。

    在介绍activity的切换动画之前我们先来说明一下实现切换activity的两种方式:

    • 调用startActivity方法启动一个新的Activity并跳转其页面

    • 调用finish方法销毁当前的Activity返回上一个Activity界面

    当调用startActivity方法的时候启动一个新的activity,这时候就涉及到了旧的Activity的退出动画和新的Activity的显示动画;
    当调用finish方法的时候,销毁当前Acitivity,就涉及到了当前Activity的退出动画和前一个Activity的显示动画;

    所以我们的activity跳转动画是分为两个部分的:一个Activity的销毁动画与一个Activity的显示动画,明白了这一点之后我们开始看一下第一种实现Activity跳转动画的方式:通过overridePendingTransition方法实现Activity切换动画。

    (一)使用overridePendingTransition方法实现Activity跳转动画

    overridePendingTransition方法是Activity中提供的Activity跳转动画方法,通过该方法可以实现Activity跳转时的动画效果。下面我们就将通过一个简单的例子看一下如何通过overridePendingTransition方法实现Activity的切换动画。

    demo例子中我们实现了Activity a中有一个点击按钮,点击按钮实现跳转Activity b的逻辑,具体代码如下:

    /**
     * 点击按钮实现跳转逻辑
     */
    button1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    /**
                     * 在调用了startActivity方法之后立即调用overridePendingTransition方法
                     */
                    Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                    startActivity(intent);
                    overridePendingTransition(R.anim.slide_in_left, R.anim.slide_in_left);
                }
            });

    可以看到我们在调用了startActivity方法之后又执行了overridePendingTransition方法,而在overridePendingTransition方法中传递了两个动画布局文件,我们首先看一下这里的动画文件具体是怎么实现的:

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:shareInterpolator="false"
        Android:zAdjustment="top">
        <translate
            Android:duration="200"
            Android:fromXDelta="-100.0%p"
            Android:toXDelta="0.0" />
    </set>

    这里的overridePendingTransition方法传递的是两个动画文件id,第一个参数是需要打开的Activity进入时的动画,第二个参数是需要关闭的Activity离开时的动画。这样我们执行了这段代码之后在跳转Activity的时候就展示了动画效果:
    这里写图片描述

    动画的效果是通过overridePendingTransition方法实现的,那么下面我们来看一下overridePendingTransition方法的定义,我们在overridependingTransition方法在定义的时候有这样的一段注释说明:

    /**
     * Call immediately after one of the flavors of {@link #startActivity(Intent)}
     * or {@link #finish} to specify an explicit transition animation to
     * perform next.
     */
    
    /**
     * @param enterAnim A resource ID of the animation resource to use for
     * the incoming activity.  Use 0 for no animation.
     * @param exitAnim A resource ID of the animation resource to use for
     * the outgoing activity.  Use 0 for no animation.
     */

    好吧,这段注释,告诉通过注释我们能够知道:

    • overridePendingTransition方法需要在startAtivity方法或者是finish方法调用之后立即执行

    • 参数enterAnim表示的是从Activity a跳转到Activity b,进入b时的动画效果

    • 参数exitAnim表示的是从Activity a跳转到Activity b,离开a时的动过效果

    • 若进入b或者是离开a时不需要动画效果,则可以传值为0

    好吧,本着批判的精神,我们来看一下是不是这样的,首先看一下如果我们在startActivity方法调用之后不立即执行overridePendingTransition方法,会有动画效果么?

    若我们将overridePendingTransition延时1s执行呢?

    /**
     * 点击按钮实现跳转逻辑
     */
    button1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                    startActivity(intent);
                    overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_left);
                    /**
                     * 延时1s执行overridePendingTransition方法
                     */
                    button1.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            overridePendingTransition(R.anim.slide_in_top, R.anim.slide_in_top);
                        }
                    }, 1000);
    
                }
            });

    好吧,执行之后我们能够发现跳转动画没有了,所以overridePendingTransition只能在startActivity或者是finish方法之后执行。

    还有一个问题,如果是在startActivity之后执行,只是在子线程中执行呢?activity的跳转动画能够执行么?

    /**
     * 点击按钮实现跳转逻辑
     */
    button1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                    startActivity(intent);
                    overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_left);
                    /**
                     * 在子线程中执行overridePendingTransition方法
                     */
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_left);
                        }
                    }).start();
    
                }
            });

    好吧,你没有猜错,activity的切换效果还是执行,也就是说overridePendingTransition方法也是可以在子线程中执行的,当然这并没什么卵用。

    好吧,在介绍完了使用overridePendingTransition方法实现Activity切换动画之后我们下面看一下使用style的方式定义实现Activity的切换动画。

    (二)使用style的方式定义Activity的切换动画

    (1)定义Application的style

    <!-- 系统Application定义 -->
    <application
            Android:allowBackup="true"
            Android:icon="@mipmap/ic_launcher"
            Android:label="@string/app_name"
            Android:supportsRtl="true"
            Android:theme="@style/AppTheme">

    (2)定义具体的AppTheme样式

    其中这里的windowAnimationStyle就是我们定义Activity切换动画的style。而@anim/slide_in_top就是我们定义的动画文件,也就是说通过为Appliation设置style,然后为windowAnimationStyle设置动画文件就可以全局的为Activity的跳转配置动画效果。

    <!-- Base application theme. -->
        <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
            <!-- Customize your theme here. -->
            <item name="colorPrimary">@color/colorPrimary</item>
            <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
            <item name="colorAccent">@color/colorAccent</item>
            <item name="Android:windowAnimationStyle">@style/activityAnim</item>
        </style>
    
    
    <!-- 使用style方式定义activity切换动画 -->
        <style name="activityAnim">
            <item name="Android:activityOpenEnterAnimation">@anim/slide_in_top</item>
            <item name="Android:activityOpenExitAnimation">@anim/slide_in_top</item>
        </style>

    而在windowAnimationStyle中存在四种动画:

    activityOpenEnterAnimation // 用于设置打开新的Activity并进入新的Activity展示的动画
    activityOpenExitAnimation  // 用于设置打开新的Activity并销毁之前的Activity展示的动画
    activityCloseEnterAnimation  // 用于设置关闭当前Activity进入上一个Activity展示的动画
    activityCloseExitAnimation  // 用于设置关闭当前Activity时展示的动画

    (3)测试代码,实现activity切换操作

    /**
             * 点击按钮,实现Activity的跳转操作
             * 通过定义style的方式实现activity的跳转动画
             */
            button2.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    /**
                     * 普通的Intent跳转Activity实现
                     */
                    Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                    startActivity(intent);
                }
            });

    这时候我们我们执行diamante逻辑之后就能发现activity在切换的时候出现了动画效果,说明我们设置的style起作用了。

    (三)使用ActivityOptions切换动画实现Activity跳转动画

    上面我们讲解的通过overridePendingTransition方法基本上可以满足我们日常中对Activity跳转动画的需求了,但是MD风格出来之后,overridePendingTransition这种老旧、生硬的方式怎么能适合我们的MD风格的App呢?好在google在新的sdk中给我们提供了另外一种Activity的过度动画——ActivityOptions。并且提供了兼容包——ActivityOptionsCompat。ActivityOptionsCompat是一个静态类,提供了相应的Activity跳转动画效果,通过其可以实现不少炫酷的动画效果。

    (1)在跳转的Activity中设置contentFeature

    @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            // 设置contentFeature,可使用切换动画
            getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
            Transition explode = TransitionInflater.from(this).inflateTransition(Android.R.transition.explode);
            getWindow().setEnterTransition(explode);
    
            setContentView(R.layout.activity_three);
        }

    这里我们在Activity的setContentView之前调用了:

    getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);

    方法,看过我的Activity布局加载流程的同学应该知道,这里的setFeature就是为activity的窗口设置特性,不同的特性对应不同的布局方式,比如可以设置无toolbar模式,有toolbar模式等等。而这里设置的是需要过渡动画,并且我们获取了Android中内置的explode动画,并设值给了Activity的window窗口对象,这样当Activity被启动的时候就会执行explode所带便的动画效果了。

    (2)在startActivity执行跳转逻辑的时候调用startActivity的重写方法,执行ActivityOptions.makeSceneTransitionAnimation方法

    /**
             * 点击按钮,实现Activity的跳转操作
             * 通过Android5.0及以上代码的方式实现activity的跳转动画
             */
            button3.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(MainActivity.this, ThreeActivity.class);
                    startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(MainActivity.this).toBundle());
                }
            });

    这里我们调用了startActivity的重载方法:

    public void startActivity(Intent intent, @Nullable Bundle options)

    并且我们传入了ActivityOptions.makeSceneTransitionAnimation,该方法表示将Activity a平滑的切换到Activity b,其还有几个重载方法可以指定相关的View,即以View为焦点平滑的从Activity a切换到Activity b。

    调用这段代码之后我们activity跳转的时候就展示出了动画效果。
    这里写图片描述

    (四)使用ActivityOptions之后内置的动画效果通过style的方式

    这种方式其实就是通过style的方式展示和使用ActivityOptions过度动画,下面是实现通过定义style方式定义过度动画的步骤:

    (1)编写过度动画文件

    <explode xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:duration="300" />

    首先我们需要在Application项目res目录下新建一个transition目录,然后创建资源文件,然后使用这些系统自带的过渡动画效果,这里设置了过度时长为300ms。

    (2)定义style文件

    <!-- Base application theme. -->
        <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
            <!-- Customize your theme here. -->
            <item name="colorPrimary">@color/colorPrimary</item>
            <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
            <item name="colorAccent">@color/colorAccent</item>
    
            <item name="Android:windowEnterTransition">@transition/activity_explode</item>
            <item name="Android:windowExitTransition">@transition/activity_explode</item>
        </style>

    在Application的style文件中添加:

    <item name="Android:windowEnterTransition">@transition/activity_explode</item>
            <item name="Android:windowExitTransition">@transition/activity_explode</item>

    并指定过渡动画效果为我们刚刚定义的过渡动画文件。

    (3)执行跳转逻辑

    /**
             * 点击按钮,实现Activity的跳转操作
             * 通过Android5.0及以上style的方式实现activity的跳转动画
             */
            button4.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    /**
                     * 调用ActivityOptions.makeSceneTransitionAnimation实现过度动画
                     */
                    Intent intent = new Intent(MainActivity.this, FourActivity.class);
                    startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(MainActivity.this).toBundle());
                }
            });

    这样执行之后也可以展示出Activity跳转过度动画了,其和通过代码方式实现的效果是类似的,而且这种动画效果是全局的。

    (五)使用ActivityOptions动画共享组件的方式实现跳转Activity动画

    这里的共享组件动画效果是指将前面一个Activity的某个子View与后面一个Activity的某个子View之间有过渡效果,即在这种过度效果下实现Activity的跳转操作。那么如何实现两个组件View之间实现过渡效果呢?

    (1)定义共享组件

    在Activity a中的button按钮点击transitionName属性:

    <Button
            Android:id="@+id/button5"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:layout_below="@+id/button4"
            Android:layout_marginTop="10dp"
            Android:layout_marginRight="10dp"
            Android:layout_marginLeft="10dp"
            Android:text="组件过度动画"
            Android:background="@color/colorPrimary"
            Android:transitionName="shareNames"
            />

    在Activity b的布局文件中为组件定义transitionName属性,这样这两个组件相当于有了过度对应关系,这里需要注意的是这两个组件的transitionName属性的值必须是相同的。

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:id="@+id/activity_second"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:gravity="center_horizontal"
        Android:orientation="vertical"
        Android:transitionName="shareNames"
        >
    
        <TextView
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:background="@color/colorAccent"
            Android:layout_marginTop="10dp"
            Android:layout_marginBottom="10dp"
            />
    
    
    </LinearLayout>

    (2)调用startActivity执行跳转动画

    /**
             * 点击按钮,实现Activity的跳转操作
             * 通过Android5.0及以上共享组件的方式实现activity的跳转动画
             */
            button5.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(MainActivity.this, FiveActivity.class);
                    startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(MainActivity.this, button5, "shareNames").toBundle());
                }
            });

    需要说明的是这里调用的ActivityOptions.makeSceneTransitionAnimation方法,传递了三个参数,其中第一个参数为context对象,第二个参数为启动Activity的共享组件,第三个参数为启动Activity的共享组件transitionName属性值。

    这样经过调用之后我们就实现了从Activity a跳转到Activity b的时候a中的组件到b中组件的过度效果。
    这里写图片描述

    总结:

    • 本文主要讲解了通过overridePendingTransition方式和ActivityOptions动画API实现Activity的切换动画效果;

    • overridePendingTransition方法从Android2.0开始,基本上能够覆盖我们activity跳转动画的需求;

    • ActivityOptions API是在Android5.0开始的,可以实现一些炫酷的动画效果,更加符合MD风格;

    • ActivityOptions还可以实现两个Activity组件之间的过度动画;

    • 本项目例子已上传待github中,欢迎star和follow,项目地址:实现activity跳转动画的五种方式


    另外对github项目,开源项目解析感兴趣的同学可以参考我的:
    Github项目解析(一)–>上传Android项目至github
    Github项目解析(二)–>将Android项目发布至JCenter代码库
    Github项目解析(三)–>Android内存泄露监测之leakcanary
    Github项目解析(四)–>动态更改TextView的字体大小
    Github项目解析(五)–>Android日志框架
    Github项目解析(六)–>自定义实现ButterKnife框架
    Github项目解析(七)–>防止按钮重复点击
    Github项目解析(八)–>Activity启动过程中获取组件宽高的五种方式

    展开全文
  • 01.波浪文本动画特效

    千次阅读 多人点赞 2020-04-05 14:03:05
    tzre 视频演示 视频地址1:https://www.ixigua.com/i6807702906041532939/ 视频地址2:https://www.bilibili.com/video/BV1Y7411m7b6 index.html CSS 波浪文本动画特效 内 容 加 载 中 . . . style...

    效果

    在这里插入图片描述

    源码

    源码地址也可以到我的网盘下载:

    源码地址:

    链接:https://pan.baidu.com/s/1B83Ui8pnaYP-s4d1GVrrBg

    提取码:tzre

    视频演示

    5分钟学会制作 CSS 波浪文本动画特效

    视频地址1:https://www.ixigua.com/i6807702906041532939/

    视频地址2:https://www.bilibili.com/video/BV1Y7411m7b6

    index.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8
    展开全文
  • Android 三种动画详解

    千次阅读 2017-03-02 10:13:07
    不能只分析源码呀,分析的同时也要整理归纳基础知识,刚好有人微博私信让全面说说Android的动画,所以今天来一发Android应用的各种Animation大集合。英文厉害的请直接移步参考Android Developer。 Android系统...

    【工匠若水 http://blog.csdn.net/yanbober 转载请注明出处。点我开始Android技术交流

    1 背景

    不能只分析源码呀,分析的同时也要整理归纳基础知识,刚好有人微博私信让全面说说Android的动画,所以今天来一发Android应用的各种Animation大集合。英文厉害的请直接移步参考Android Developer

    Android系统提供了很多丰富的API去实现UI的2D与3D动画,最主要的划分可以分为如下几类:

    • View Animation: 视图动画,也叫Tween(补间)动画,可以在一个视图容器内执行一系列简单变换(位置、大小、旋转、透明度)。在古老的Android版本系统中就已经提供了,只能被用来设置View的动画。

    • Drawable Animation: 这种动画(也叫Frame动画、帧动画)其实可以划分到视图动画的类别,专门用来一个一个的显示Drawable的resources,就像放幻灯片一样。

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

    可以看见,当前应用程序开发涉及的主要动画也就这三大类,我们接下来以类别为基础来慢慢展开说明。

    【工匠若水 http://blog.csdn.net/yanbober 转载请注明出处。点我开始Android技术交流

    2 View Animation(视图动画)使用详解

    2-1 视图动画概述

    视图动画,也叫Tween(补间)动画可以在一个视图容器内执行一系列简单变换(位置、大小、旋转、透明度)。譬如,如果你有一个TextView对象,您可以移动、旋转、缩放、透明度设置其文本,当然,如果它有一个背景图像,背景图像会随着文本变化。

    补间动画通过XML或Android代码定义,建议使用XML文件定义,因为它更具可读性、可重用性。

    如下是视图动画相关的类继承关系:

    这里写图片描述

    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元素的容器

    通过上图和上表可以直观的看出来补间动画的关系及种类了吧,接下来我们就详细一个一个的介绍一下各种补间动画。

    2-2 视图动画详细说明

    可以看出来Animation抽象类是所有补间动画类的基类,所以基类会提供一些通用的动画属性方法,如下我们就来详细看看这些属性,关于这些属性详细官方解释FQ点击我或者FQ点击我

    2-2-1 Animation属性详解

    xml属性 java方法 解释
    android:detachWallpaper setDetachWallpaper(boolean) 是否在壁纸上运行
    android:duration setDuration(long) 动画持续时间,毫秒为单位
    android:fillAfter setFillAfter(boolean) 控件动画结束时是否保持动画最后的状态
    android:fillBefore setFillBefore(boolean) 控件动画结束时是否还原到开始动画前的状态
    android:fillEnabled setFillEnabled(boolean) 与android:fillBefore效果相同
    android:interpolator setInterpolator(Interpolator) 设定插值器(指定的动画效果,譬如回弹等)
    android:repeatCount setRepeatCount(int) 重复次数
    android:repeatMode setRepeatMode(int) 重复类型有两个值,reverse表示倒序回放,restart表示从头播放
    android:startOffset setStartOffset(long) 调用start函数之后等待开始运行的时间,单位为毫秒
    android:zAdjustment setZAdjustment(int) 表示被设置动画的内容运行时在Z轴上的位置(top/bottom/normal),默认为normal


    也就是说,无论我们补间动画的哪一种都已经具备了这种属性,也都可以设置使用这些属性中的一个或多个。

    那接下来我们就看看每种补间动画特有的一些属性说明吧。

    2-2-2 Alpha属性详解

    xml属性 java方法 解释
    android:fromAlpha AlphaAnimation(float fromAlpha, …) 动画开始的透明度(0.0到1.0,0.0是全透明,1.0是不透明)
    android:toAlpha AlphaAnimation(…, float toAlpha) 动画结束的透明度,同上

    2-2-3 Rotate属性详解

    xml属性 java方法 解释
    android:fromDegrees RotateAnimation(float fromDegrees, …) 旋转开始角度,正代表顺时针度数,负代表逆时针度数
    android:toDegrees RotateAnimation(…, float toDegrees, …) 旋转结束角度,正代表顺时针度数,负代表逆时针度数
    android:pivotX RotateAnimation(…, float pivotX, …) 缩放起点X坐标(数值、百分数、百分数p,譬如50表示以当前View左上角坐标加50px为初始点、50%表示以当前View的左上角加上当前View宽高的50%做为初始点、50%p表示以当前View的左上角加上父控件宽高的50%做为初始点)
    android:pivotY RotateAnimation(…, float pivotY) 缩放起点Y坐标,同上规律

    2-2-4 Scale属性详解

    xml属性 java方法 解释
    android:fromXScale ScaleAnimation(float fromX, …) 初始X轴缩放比例,1.0表示无变化
    android:toXScale ScaleAnimation(…, float toX, …) 结束X轴缩放比例
    android:fromYScale ScaleAnimation(…, float fromY, …) 初始Y轴缩放比例
    android:toYScale ScaleAnimation(…, float toY, …) 结束Y轴缩放比例
    android:pivotX ScaleAnimation(…, float pivotX, …) 缩放起点X轴坐标(数值、百分数、百分数p,譬如50表示以当前View左上角坐标加50px为初始点、50%表示以当前View的左上角加上当前View宽高的50%做为初始点、50%p表示以当前View的左上角加上父控件宽高的50%做为初始点)
    android:pivotY ScaleAnimation(…, float pivotY) 缩放起点Y轴坐标,同上规律

    2-2-5 Translate属性详解

    xml属性 java方法 解释
    android:fromXDelta TranslateAnimation(float fromXDelta, …) 起始点X轴坐标(数值、百分数、百分数p,譬如50表示以当前View左上角坐标加50px为初始点、50%表示以当前View的左上角加上当前View宽高的50%做为初始点、50%p表示以当前View的左上角加上父控件宽高的50%做为初始点)
    android:fromYDelta TranslateAnimation(…, float fromYDelta, …) 起始点Y轴从标,同上规律
    android:toXDelta TranslateAnimation(…, float toXDelta, …) 结束点X轴坐标,同上规律
    android:toYDelta TranslateAnimation(…, float toYDelta) 结束点Y轴坐标,同上规律

    2-2-6 AnimationSet详解

    AnimationSet继承自Animation,是上面四种的组合容器管理类,没有自己特有的属性,他的属性继承自Animation,所以特别注意,当我们对set标签使用Animation的属性时会对该标签下的所有子控件都产生影响。

    2-3 视图动画使用方法

    通过上面对于动画的属性介绍之后我们来看看在Android中这些动画如何使用(PS:这里直接演示xml方式,至于Java方式太简单了就不说了),如下:

    <?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);

     

    上面就是一个标准的使用我们定义的补间动画的模板。至于补间动画的使用,Animation还有如下一些比较实用的方法介绍:

    Animation类的方法 解释
    reset() 重置Animation的初始化
    cancel() 取消Animation动画
    start() 开始Animation动画
    setAnimationListener(AnimationListener listener) 给当前Animation设置动画监听
    hasStarted() 判断当前Animation是否开始
    hasEnded() 判断当前Animation是否结束


    既然补间动画只能给View使用,那就来看看View中和动画相关的几个常用方法吧,如下:

    View类的常用动画操作方法 解释
    startAnimation(Animation animation) 对当前View开始设置的Animation动画
    clearAnimation() 取消当View在执行的Animation动画

    到此整个Android的补间动画常用详细属性及方法全部介绍完毕,如有特殊的属性需求可以访问Android Developer查阅即可。如下我们就来个综合大演练。

    2-4 视图动画注意事项

    关于视图动画(补间动画)的例子我就不介绍了,网上简直多的都泛滥了。只是强调在使用补间动画时注意如下一点即可:

    特别特别注意:补间动画执行之后并未改变View的真实布局属性值。切记这一点,譬如我们在Activity中有一个 Button在屏幕上方,我们设置了平移动画移动到屏幕下方然后保持动画最后执行状态呆在屏幕下方,这时如果点击屏幕下方动画执行之后的Button是没 有任何反应的,而点击原来屏幕上方没有Button的地方却响应的是点击Button的事件。

    2-5 视图动画Interpolator插值器详解

    2-5-1 插值器简介

    介绍补间动画插值器之前我们先来看一幅图,如下:

    这里写图片描述

    可以看见其实各种插值器都是实现了Interpolator接口而已,同时可以看见系统提供了许多已经实现OK的插值器,具体如下:

    java类 xml id值 描述
    AccelerateDecelerateInterpolator @android:anim/accelerate_decelerate_interpolator 动画始末速率较慢,中间加速
    AccelerateInterpolator @android:anim/accelerate_interpolator 动画开始速率较慢,之后慢慢加速
    AnticipateInterpolator @android:anim/anticipate_interpolator 开始的时候从后向前甩
    AnticipateOvershootInterpolator @android:anim/anticipate_overshoot_interpolator 类似上面AnticipateInterpolator
    BounceInterpolator @android:anim/bounce_interpolator 动画结束时弹起
    CycleInterpolator @android:anim/cycle_interpolator 循环播放速率改变为正弦曲线
    DecelerateInterpolator @android:anim/decelerate_interpolator 动画开始快然后慢
    LinearInterpolator @android:anim/linear_interpolator 动画匀速改变
    OvershootInterpolator @android:anim/overshoot_interpolator 向前弹出一定值之后回到原来位置
    PathInterpolator   新增,定义路径坐标后按照路径坐标来跑。

    如上就是系统提供的一些插值器,下面我们来看看怎么使用他们。

    2-5-2 插值器使用方法

    插值器的使用比较简答,如下:

    <set android:interpolator="@android:anim/accelerate_interpolator">
        ...
    </set>

     

    2-5-3 插值器的自定义

    有时候你会发现系统提供的插值器不够用,可能就像View一样需要自定义。所以接下来我们来看看插值器的自定义,关于插值器的自定义分为两种实现方式,xml自定义实现(其实就是对现有的插值器的一些属性修改)或者java代码实现方式。如下我们来说说。

    先看看XML自定义插值器的步骤:

    • 在res/anim/目录下创建filename.xml文件。
    • 修改你准备自定义的插值器如下:
    <?xml version="1.0" encoding="utf-8"?>
    <InterpolatorName xmlns:android="http://schemas.android.com/apk/res/android" android:attribute_name="value" />

     

    • 在你的补间动画文件中引用该文件即可。

    可以看见上面第二步修改的是现有插值器的一些属性,但是有些插值器却不具备修改属性,具体如下:

    <accelerateDecelerateInterpolator>

    无可自定义的attribute。

    <accelerateInterpolator>

    android:factor 浮点值,加速速率(默认值为1)。

    <anticipateInterploator>

    android:tension 浮点值,起始点后拉的张力数(默认值为2)。

    <anticipateOvershootInterpolator>

    android:tension 浮点值,起始点后拉的张力数(默认值为2)。 
    android:extraTension 浮点值,拉力的倍数(默认值为1.5)。

    <bounceInterpolator>

    无可自定义的attribute。

    <cycleInterplolator>

    android:cycles 整形,循环的个数(默认为1)。

    <decelerateInterpolator>

    android:factor 浮点值,减速的速率(默认为1)。

    <linearInterpolator>

    无可自定义的attribute。

    <overshootInterpolator>

    android:tension 浮点值,超出终点后的张力(默认为2)。

    再来看看Java自定义插值器的(Java自定义插值器其实是xml自定义的升级,也就是说如果我们修改xml的属性还不能满足需求,那就可以选择通过Java来实现)方式。

    可以看见上面所有的Interpolator都实现了Interpolator接口,而Interpolator接口又继承自 TimeInterpolator,TimeInterpolator接口定义了一个float getInterpolation(float input);方法,这个方法是由系统调用的,其中的参数input代表动画的时间,在0和1之间,也就是开始和结束之间。

    如下就是一个动画始末速率较慢、中间加速的AccelerateDecelerateInterpolator插值器:

    public class AccelerateDecelerateInterpolator extends BaseInterpolator implements NativeInterpolatorFactory { ...... public float getInterpolation(float input) { return (float)(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f; } ...... }

     

    到此整个补间动画与补间动画的插值器都分析完毕了,接下来看下别的动画。

    【工匠若水 http://blog.csdn.net/yanbober 转载请注明出处。点我开始Android技术交流

    3 Drawable Animation(Drawable动画)使用详解

    3-1 Drawable动画概述

    Drawable动画其实就是Frame动画(帧动画),它允许你实现像播放幻灯片一样的效果,这种动画的实质其实是Drawable,所以这种动画的XML定义方式文件一般放在res/drawable/目录下。具体关于帧动画的xml使用方式FQ点击我查看,java方式FQ点击我查看。

    如下图就是帧动画的源码文件:

    这里写图片描述

    可以看见实际的真实父类就是Drawable。

    3-2 Drawable动画详细说明

    我们依旧可以使用xml或者java方式实现帧动画。但是依旧推荐使用xml,具体如下:

    <animation-list> 必须是根节点,包含一个或者多个<item>元素,属性有:

    • android:oneshot true代表只执行一次,false循环执行。
    • <item> 类似一帧的动画资源。

    <item> animation-list的子项,包含属性如下:

    • android:drawable 一个frame的Drawable资源。
    • android:duration 一个frame显示多长时间。

    3-3 Drawable动画实例演示

    关于帧动画相对来说比较简单,这里给出一个常规使用框架,如下:

    <!-- 注意: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();

     

    特别注意,AnimationDrawable的start()方法不能在Activity的onCreate方法中调运,因为AnimationDrawable还未完全附着到window上,所以最好的调运时机是onWindowFocusChanged()方法中。

    至此帧动画也就说明完成了。让我们接下来进入Android更牛叉的动画类型。

    【工匠若水 http://blog.csdn.net/yanbober 转载请注明出处。点我开始Android技术交流

    4 Property Animation(属性动画)使用详解

    在使用属性动画之前先来看几个常用的View属性成员:

    • translationX,translationY:控制View的位置,值是相对于View容器左上角坐标的偏移。
    • rotationX,rotationY:控制相对于轴心旋转。
    • x,y:控制View在容器中的位置,即左上角坐标加上translationX和translationY的值。
    • alpha:控制View对象的alpha透明度值。

    这几个常用的属性相信大家都很熟悉,接下来的属性动画我们就从这里展开。

    4-1 属性动画概述

    Android 3.0以后引入了属性动画,属性动画可以轻而易举的实现许多View动画做不到的事,上面也看见了,View动画无非也就做那几种事情,别的也搞不定,而 属性动画就可以的,譬如3D旋转一张图片。其实说白了,你记住一点就行,属性动画实现原理就是修改控件的属性值实现的动画。

    具体先看下类关系:

    /**
     * This is the superclass for classes which provide basic support for animations which can be
     * started, ended, and have <code>AnimatorListeners</code> added to them.
     */
    public abstract class Animator implements Cloneable { ...... }

     

    所有的属性动画的抽象基类就是他。我们看下他的实现子类: 
    这里写图片描述 
    其实可以看见,属性动画的实现有7个类(PS,之所以类继承关系列表会出来那么多是因为我下载了所有版本的SDK,你只用关注我红点标注的就行,妹 的,ubuntu下图片处理工具怎么都这么难用),进去粗略分析可以发现,好几个是hide的类,而其他可用的类继承关系又如下:

    这里写图片描述

    java类名 xml关键字 描述信息
    ValueAnimator <animator> 放置在res/animator/目录下 在一个特定的时间里执行一个动画
    TimeAnimator 不支持/点我查看原因 时序监听回调工具
    ObjectAnimator <objectAnimator> 放置在res/animator/目录下 一个对象的一个属性动画
    AnimatorSet <set> 放置在res/animator/目录下 动画集合

    所以可以看见,我们平时使用属性动画的重点就在于AnimatorSet、ObjectAnimator、TimeAnimator、ValueAnimator。所以接下来我们就来依次说说如何使用。

    4-2 属性动画详细说明

    4-2-1 属性动画计算原理

    参看Android官方文档,英文原版详情点我查看!

    Android属性动画(注意最低兼容版本,不过可以使用开源项目来替代低版本问题)提供了以下属性:

    • Duration:动画的持续时间;
    • TimeInterpolation:定义动画变化速率的接口,所有插值器都必须实现此接口,如线性、非线性插值器;
    • TypeEvaluator:用于定义属性值计算方式的接口,有int、float、color类型,根据属性的起始、结束值和插值一起计算出当前时间的属性值;
    • Animation sets:动画集合,即可以同时对一个对象应用多个动画,这些动画可以同时播放也可以对不同动画设置不同的延迟;
    • Frame refreash delay:多少时间刷新一次,即每隔多少时间计算一次属性值,默认为10ms,最终刷新时间还受系统进程调度与硬件的影响;
    • Repeat Country and behavoir:重复次数与方式,如播放3次、5次、无限循环,可以让此动画一直重复,或播放完时向反向播放;

    接下来先来看官方为了解释原理给出的两幅图(其实就是初中物理题,不解释):

    这里写图片描述 
    上面就是一个线性匀速动画,描述了一个Object的X属性运动动画,该对象的X坐标在40ms内从0移动到40,每10ms刷新一次,移动4次,每次移动为40/4=10pixel。 
    这里写图片描述 
    上面是一个非匀速动画,描述了一个Object的X属性运动动画,该对象的X坐标在40ms内从0移动到40,每10ms刷新一次,移动4次,但是速率不同,开始和结束的速度要比中间部分慢,即先加速后减速。

    接下来我们来详细的看一下,属性动画系统的重要组成部分是如何计算动画值的,下图描述了如上面所示动画的实现作用过程。

    这里写图片描述

    其中的ValueAnimator是动画的执行类,跟踪了当前动画的执行时间和当前时间下的属性值;ValueAnimator封装了动画的 TimeInterpolator时间插值器和一个TypeEvaluator类型估值,用于设置动画属性的值,就像上面图2非线性动画 里,TimeInterpolator使用了AccelerateDecelerateInterpolator、TypeEvaluator使用了 IntEvaluator。

    为了执行一个动画,你需要创建一个ValueAnimator,并且指定目标对象属性的开始、结束值和持续时间。在调用start后,整个动画过程 中, ValueAnimator会根据已经完成的动画时间计算得到一个0到1之间的分数,代表该动画的已完成动画百分比。0表示0%,1表示100%,譬如上 面图一线性匀速动画中总时间 t = 40 ms,t = 10 ms的时候是 0.25。

    当ValueAnimator计算完已完成动画分数后,它会调用当前设置的TimeInterpolator,去计算得到一个 interpolated(插值)分数,在计算过程中,已完成动画百分比会被加入到新的插值计算中。如上图2非线性动画中,因为动画的运动是缓慢加速的, 它的插值分数大约是 0.15,小于t = 10ms时的已完成动画分数0.25。而在上图1中,这个插值分数一直和已完成动画分数是相同的。

    当插值分数计算完成后,ValueAnimator会根据插值分数调用合适的 TypeEvaluator去计算运动中的属性值。

    好了,现在我们来看下代码就明白这段话了,上面图2非线性动画里,TimeInterpolator使用了 AccelerateDecelerateInterpolator、TypeEvaluator使用了IntEvaluator。所以这些类都是标准的 API,我们来看下标准API就能类比自己写了,如下:

    首先计算已完成动画时间分数(以10ms为例):t=10ms/40ms=0.25。

    接着看如下源码如何实现计算差值分数的:

    public class AccelerateDecelerateInterpolator extends BaseInterpolator implements NativeInterpolatorFactory { public AccelerateDecelerateInterpolator() { } ...... //这是我们关注重点,可以发现如下计算公式计算后(input即为时间因子)插值大约为0.15。 public float getInterpolation(float input) { return (float)(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f; } ...... }

     

    其实AccelerateDecelerateInterpolator的基类接口就是TimeInterpolator,如下,他只有getInterpolation方法,也就是上面我们关注的方法。

    public interface TimeInterpolator {
        float getInterpolation(float input); }

     

    接着ValueAnimator会根据插值分数调用合适的TypeEvaluator(IntEvaluator)去计算运动中的属性值,如下,因为startValue = 0,所以属性值:0+0.15*(40-0)= 6。

    public class IntEvaluator implements TypeEvaluator<Integer> { public Integer evaluate(float fraction, Integer startValue, Integer endValue) { int startInt = startValue; return (int)(startInt + fraction * (endValue - startInt)); } }

     

    这就是官方给的一个关于属性动画实现的过程及基本原理解释,相信你看到这里是会有些迷糊的,没关系,你先有个大致概念就行,接下来我们会慢慢进入实战,因为Android的属性动画相对于其他动画来说涉及的知识点本来就比较复杂,所以我们慢慢来。

    4-2-2 XML方式属性动画

    在xml中可直接用的属性动画节点有ValueAnimator、ObjectAnimator、AnimatorSet。如下是官方的一个例子和解释(详情点我):

    <set
      android:ordering=["together" | "sequentially"]> <objectAnimator android:propertyName="string" android:duration="int" android:valueFrom="float | int | color" android:valueTo="float | int | color" android:startOffset="int" android:repeatCount="int" android:repeatMode=["repeat" | "reverse"] android:valueType=["intType" | "floatType"]/> <animator android:duration="int" android:valueFrom="float | int | color" android:valueTo="float | int | color" android:startOffset="int" android:repeatCount="int" android:repeatMode=["repeat" | "reverse"] android:valueType=["intType" | "floatType"]/> <set> ... </set> </set>

     

    <set>属性解释:

    xml属性 解释
    android:ordering 控制子动画启动方式是先后有序的还是同时进行。sequentially:动画按照先后顺序;together(默认):动画同时启动;


    <objectAnimator>属性解释:

    xml属性 解释
    android:propertyName String类型,必须要设置的节点属性,代表要执行动画的属性(通过名字引用),辟如你可以指定了一个View的”alpha” 或者 “backgroundColor” ,这个objectAnimator元素没有对外说明target属性,所以你不能在XML中设置执行这个动画,必须通过调用 loadAnimator()方法加载你的XML动画资源,然后调用setTarget()应用到具备这个属性的目标对象上(譬如TextView)。
    android:valueTo float、int或者color类型,必须要设置的节点属性,表明动画结束的点;如果是颜色的话,由6位十六进制的数字表示。
    android:valueFrom 相对应valueTo,动画的起始点,如果没有指定,系统会通过属性的get方法获取,颜色也是6位十六进制的数字表示。
    android:duration 动画的时长,int类型,以毫秒为单位,默认为300毫秒。
    android:startOffset 动画延迟的时间,从调用start方法后开始计算,int型,毫秒为单位。
    android:repeatCount 一个动画的重复次数,int型,”-1“表示无限循环,”1“表示动画在第一次执行完成后重复执行一次,也就是两次,默认为0,不重复执行。
    android:repeatMode 重复模式:int型,当一个动画执行完的时候应该如何处理。该值必须是正数或者是-1,“reverse”会使得按照动画向相反的方向执行,可实现类似钟摆效果。“repeat”会使得动画每次都从头开始循环。
    android:valueType 关键参数,如果该value是一个颜色,那么就不需要指定,因为动画框架会自动的处理颜色值。有intType和floatType(默认)两种:分别说明动画值为int和float型。


    <objectAnimator>属性解释: 
    同上<objectAnimator>属性,不多介绍。

    XML属性动画使用方法:

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

     

    4-2-3 Java方式属性动画

    1、ObjectAnimator:继承自ValueAnimator,允许你指定要进行动画的对象以及该对象 的一个属性。该类会根据计算得到的新值自动更新属性。大多数的情况使用ObjectAnimator就足够了,因为它使得目标对象动画值的处理过程变得足 够简单,不用像ValueAnimator那样自己写动画更新的逻辑,但是ObjectAnimator有一定的限制,比如它需要目标对象的属性提供指定 的处理方法(譬如提供getXXX,setXXX方法),这时候你就需要根据自己的需求在ObjectAnimator和ValueAnimator中看 哪种实现更方便了。

    ObjectAnimator类提供了ofInt、ofFloat、ofObject这个三个常用的方法,这些方法都是设置动画作用的元素、属性、开始、结束等任意属性值。当属性值(上面方法的参数)只设置一个时就把通过getXXX反射获取的值作为起点,设置的值作为终点;如果设置两个(参数),那么一个是开始、另一个是结束。
    
    特别注意:ObjectAnimator的动画原理是不停的调用setXXX方法更新属性值,所有使用ObjectAnimator更新属性时的前提是Object必须声明有getXXX和setXXX方法。
    

    我们通常使用ObjectAnimator设置View已知的属性来生成动画,而一般View已知属性变化时都会主动触发重绘图操作,所以动画会自 动实现;但是也有特殊情况,譬如作用Object不是View,或者作用的属性没有触发重绘,或者我们在重绘时需要做自己的操作,那都可以通过如下方法手 动设置:

    ObjectAnimator mObjectAnimator= ObjectAnimator.ofInt(view, "customerDefineAnyThingName", 0,  1).setDuration(2000);
    mObjectAnimator.addUpdateListener(new AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { //int value = animation.getAnimatedValue(); 可以获取当前属性值 //view.postInvalidate(); 可以主动刷新 //view.setXXX(value); //view.setXXX(value); //......可以批量修改属性 } });

     

    如下是一个我在项目中的Y轴3D旋转动画实现实例:

    ObjectAnimator.ofFloat(view, "rotationY", 0.0f, 360.0f).setDuration(1000).start();

     

    2、PropertyValuesHolder:多属性动画同时工作管理类。有时候我们需要同时修改多个属性,那就可以用到此类,具体如下:

    PropertyValuesHolder a1 = PropertyValuesHolder.ofFloat("alpha", 0f, 1f);  
    PropertyValuesHolder a2 = PropertyValuesHolder.ofFloat("translationY", 0, viewWidth); ...... ObjectAnimator.ofPropertyValuesHolder(view, a1, a2, ......).setDuration(1000).start();

     

    如上代码就可以实现同时修改多个属性的动画啦。

    3、ValueAnimator:属性动画中的时间驱动,管理着动画时间的开始、结束属性值,相应时间属性值计算方法等。包含所有计算动画值的核心函数以及每一个动画时间节点上的信息、一个动画是否重复、是否监听更新事件等,并且还可以设置自定义的计算类型。

    特别注意:ValueAnimator只是动画计算管理驱动,设置了作用目标,但没有设置属性,需要通过updateListener里设置属性才会生效。
    
    ValueAnimator animator = ValueAnimator.ofFloat(0, mContentHeight);  //定义动画
    animator.setTarget(view);   //设置作用目标
    animator.setDuration(5000).start();
    animator.addUpdateListener(new AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation){ float value = (float) animation.getAnimatedValue(); view.setXXX(value); //必须通过这里设置属性值才有效 view.mXXX = value; //不需要setXXX属性方法 } });

     

    大眼看上去可以发现和ObjectAnimator没啥区别,实际上正是由于ValueAnimator不直接操作属性值,所以要操作对象的属性可以不需要setXXX与getXXX方法,你完全可以通过当前动画的计算去修改任何属性。

    4、AnimationSet:动画集合,提供把多个动画组合成一个组合的机制,并可设置动画的时序关系,如同时播放、顺序播放或延迟播放。具体使用方法比较简单,如下:

    ObjectAnimator a1 = ObjectAnimator.ofFloat(view, "alpha", 1.0f, 0f);  
    ObjectAnimator a2 = ObjectAnimator.ofFloat(view, "translationY", 0f, viewWidth); ...... AnimatorSet animSet = new AnimatorSet(); animSet.setDuration(5000); animSet.setInterpolator(new LinearInterpolator()); //animSet.playTogether(a1, a2, ...); //两个动画同时执行 animSet.play(a1).after(a2); //先后执行 ......//其他组合方式 animSet.start(); 
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    5、Evaluators相关类解释: Evaluators就是属性动画系统如何去计算一个属性值。它们通过Animator提供的动画的起始和结束值去计算一个动画的属性值。

    • IntEvaluator:整数属性值。

    • FloatEvaluator:浮点数属性值。

    • ArgbEvaluator:十六进制color属性值。

    • TypeEvaluator:用户自定义属性值接口,譬如对象属性值类型不是int、float、color类型,你必须实现这个接口去定义自己的数据类型。

    既然说到这了,那就来个例子吧,譬如我们需要实现一个自定义属性类型和计算规则的属性动画,如下类型float[]:

    ValueAnimator valueAnimator = new ValueAnimator();
    valueAnimator.setDuration(5000);
    valueAnimator.setObjectValues(new float[2]); //设置属性值类型 valueAnimator.setInterpolator(new LinearInterpolator()); valueAnimator.setEvaluator(new TypeEvaluator<float[]>() { @Override public float[] evaluate(float fraction, float[] startValue, float[] endValue) { //实现自定义规则计算的float[]类型的属性值 float[] temp = new float[2]; temp[0] = fraction * 2; temp[1] = (float)Math.random() * 10 * fraction; return temp; } }); valueAnimator.start(); valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { float[] xyPos = (float[]) animation.getAnimatedValue(); view.setHeight(xyPos[0]); //通过属性值设置View属性动画 view.setWidth(xyPos[1]); //通过属性值设置View属性动画 } });

    6、Interpolators相关类解释:

    • AccelerateDecelerateInterolator:先加速后减速。

    • AccelerateInterpolator:加速。

    • DecelerateInterpolator:减速。

    • AnticipateInterpolator:先向相反方向改变一段再加速播放。

    • AnticipateOvershootInterpolator:先向相反方向改变,再加速播放,会超出目标值然后缓慢移动至目标值,类似于弹簧回弹。

    • BounceInterpolator:快到目标值时值会跳跃。

    • CycleIinterpolator:动画循环一定次数,值的改变为一正弦函数:Math.sin(2 * mCycles * Math.PI * input)。

    • LinearInterpolator:线性均匀改变。

    • OvershottInterpolator:最后超出目标值然后缓慢改变到目标值。

    • TimeInterpolator:一个允许自定义Interpolator的接口,以上都实现了该接口。

    举个例子,就像系统提供的标准API一样,如下就是加速插值器的实现代码,我们自定义时也可以类似实现:

    //开始很慢然后不断加速的插值器。
    public class AccelerateInterpolator implements Interpolator { private final float mFactor; private final double mDoubleFactor; public AccelerateInterpolator() { mFactor = 1.0f; mDoubleFactor = 2.0; } ...... //input 0到1.0。表示动画当前点的值,0表示开头,1表示结尾。 //return 插值。值可以大于1超出目标值,也可以小于0突破低值。 @Override public float getInterpolation(float input) { //实现核心代码块 if (mFactor == 1.0f) { return input * input; } else { return (float)Math.pow(input, mDoubleFactor); } } }

    综上可以发现,我们可以使用现有系统提供标准的东东实现属性动画,也可以通过自定义继承相关接口实现自己的动画,只要实现上面提到的那些主要方法即可。

    4-2-4 Java属性动画拓展之ViewPropertyAnimator动画

    在Android API 12时,View中添加了animate方法,具体如下:

    public class View implements Drawable.Callback, KeyEvent.Callback, AccessibilityEventSource { ...... /** * This method returns a ViewPropertyAnimator object, which can be used to animate * specific properties on this View. * * @return ViewPropertyAnimator The ViewPropertyAnimator associated with this View. */ public ViewPropertyAnimator animate() { if (mAnimator == null) { mAnimator = new ViewPropertyAnimator(this); } return mAnimator; } ...... }

    可以看见通过View的animate()方法可以得到一个ViewPropertyAnimator的属性动画(有人说他没有继承Animator类,是的,他是成员关系,不是之前那种继承关系)。

    ViewPropertyAnimator提供了一种非常方便的方法为View的部分属性设置动画(切记,是部分属性),它可以直接使用一个 Animator对象设置多个属性的动画;在多属性设置动画时,它比 上面的ObjectAnimator更加牛逼、高效,因为他会管理多个属性的invalidate方法统一调运触发,而不像上面分别调用,所以还会有一些 性能优化。如下就是一个例子:

    myView.animate().x(0f).y(100f).start(); 

     

    4-2-5 Java属性动画拓展之LayoutAnimator容器布局动画

    Property动画系统还提供了对ViewGroup中View添加时的动画功能,我们可以用LayoutTransition对 ViewGroup中的View进行动画设置显示。LayoutTransition的动画效果都是设置给ViewGroup,然后当被设置动画的 ViewGroup中添加删除View时体现出来。该类用于当前布局容器中有View添加、删除、隐藏、显示等时候定义布局容器自身的动画和View的动 画,也就是说当在一个LinerLayout中隐藏一个View的时候,我们可以自定义 整个由于LinerLayout隐藏View而改变的动画,同时还可以自定义被隐藏的View自己消失时候的动画等。

    我们可以发现LayoutTransition类中主要有五种容器转换动画类型,具体如下:

    • LayoutTransition.APPEARING:当View出现或者添加的时候View出现的动画。

    • LayoutTransition.CHANGE_APPEARING:当添加View导致布局容器改变的时候整个布局容器的动画。

    • LayoutTransition.DISAPPEARING:当View消失或者隐藏的时候View消失的动画。

    • LayoutTransition.CHANGE_DISAPPEARING:当删除或者隐藏View导致布局容器改变的时候整个布局容器的动画。

    • LayoutTransition.CHANGE:当不是由于View出现或消失造成对其他View位置造成改变的时候整个布局容器的动画。

    XML方式使用系统提供的默认LayoutTransition动画:

    我们可以通过如下方式使用系统提供的默认ViewGroup的LayoutTransition动画:

    android:animateLayoutChanges=”true”

    在ViewGroup添加如上xml属性默认是没有任何动画效果的,因为前面说了,该动画针对于ViewGroup内部东东发生改变时才有效,所以当我们设置如上属性然后调运ViewGroup的addView、removeView方法时就能看见系统默认的动画效果了。

    还有一种就是通过如下方式设置:

    android:layoutAnimation=”@anim/customer_anim”

     

    通过这种方式就能实现很多吊炸天的动画。

    Java方式使用系统提供的默认LayoutTransition动画:

    在使用LayoutTransition时,你可以自定义这几种事件类型的动画,也可以使用默认的动画,总之最终都是通过 setLayoutTransition(LayoutTransition lt)方法把这些动画以一个LayoutTransition对象设置给一个ViewGroup。

    譬如实现如上Xml方式的默认系统LayoutTransition动画如下:

    mTransitioner = new LayoutTransition();
    mViewGroup.setLayoutTransition(mTransitioner);

    稍微再高端一点吧,我们来自定义这几类事件的动画,分别实现他们,那么你可以像下面这么处理:

    mTransitioner = new LayoutTransition();
    ......
    ObjectAnimator anim = ObjectAnimator.ofFloat(this, "scaleX", 0, 1); ......//设置更多动画 mTransition.setAnimator(LayoutTransition.APPEARING, anim); ......//设置更多类型的动画 mViewGroup.setLayoutTransition(mTransitioner);

    到此通过LayoutTransition你就能实现类似小米手机计算器切换普通型和科学型的炫酷动画了。

    【工匠若水 http://blog.csdn.net/yanbober 转载请注明出处。点我开始Android技术交流

    5 Android动画总结

    到此Android动画基本已经描述OK了,也就这么三大类,尤其是属性动画更加一筹。但是特别说一句,上面基本都没有提及到各种动画的 Listener接口,原因是这个玩意太简单,所以不提了,相信你会监听View的onClickListener就一定会触类旁通动画的 Listener方法的。有了这些基础相信无论是自定义控件时还是自定义动画时都会起到直接的指导参考作用。其实对于Android的动画实现远远不止现 在提到的这些,但是这些又是基础,所以后面还会写文章说说Android提供的其他动画参考工具类的。

    现在我们继续沿用官方的对比,翻译一下这些动画的区别,具体如下(点我参看原文How Property Animation Differs from View Animation):

    View动画:

    View动画只能够为View添加动画,如果想为非View对象添加动画须自己实现;且View动画支持的种类很少;尤其是他改变的是View的绘制效果,View的属性没有改变,其位置与大小都不变; View动画代码量少,使用简单方便。

    Property动画:

    弥补了View动画的缺陷,你可以为一个对象的任意属性添加动画,对象自己的属性会被真的改变;当对象的属性变化的时候,属性动画会自动刷新屏幕;属性动画改变的是对象的真实属性,而且属性动画不止用于View,还可以用于任何对象。

    好了,太不容易了!这一篇文章差点难产了,断断续续各种事,终于追求完美OK了,接下来博客恢复正常更新。

    【工匠若水 http://blog.csdn.net/yanbober 转载请注明出处。点我开始Android技术交流

    展开全文
  • WPF TextBlock 文本 动画

    千次阅读 2012-06-04 17:02:02
    无聊中想给文本信息加一个动画,提高用户对这块信息的关注。下面的一段代码可以实现上诉要求。    RoutedEvent="Loaded">      Storyboard.TargetName="Test"  Storyboard.TargetProperty="Color
  • DoTween关于文本动画的使用方法

    千次阅读 2018-04-16 10:40:23
    一、创建一个场景,搭建好对应的UI界面,放置一个按钮,一个Text文本二、编写关于文本动画的脚本/*** * Title:"SimpleUIFrame" UI框架项目 * 主题:文本动画测试 * Description: * 功能:XXX * Date...
  • 文本提示显示5秒后消失动画制作效果如上,配置如下: 1、载入整个网页时,隐藏元件,元件名称“文件生成中tip” 2、点击【导出CSV文件】按钮,添加鼠标点击时的动作显示-旋转-等待-隐藏动画 ①显示元件,逐渐...
  • Android开机动画有两修改方法,android 2.0及之后,使用bootanimation程序显示开机画面,如需修改开机画面,不用修改代码,只需按格式要求做bootanimation.zip包,放在系统的/system/media目录中,或/data/local...
  • FuncAnimation是matplotlib生成逐帧动画的常用类,它的工作原理就是按照一定时间间隔不断调用参数func对应的函数生成动画。 FuncAnimation的继承关系如下: matplotlib.animation.Animation→matplotlib.animation....
  • 最近项目用到文本滚动通知效果,首先想到了跑马灯可是限制太多不适用,就自己写了三种实现方式,本篇来介绍第一滚动方式。1.通过scrollTo()方法来实现。这个方法原理是,需要一个承载TextView的父控件,我这里用到...
  • 9网页动画常用实现方式总结

    千次阅读 2012-11-28 16:36:54
    目前来说,没有一种方式是完美的。 GIF兼容性最好,但是画质差,无交互。 Canvas很火热,功能也强大,编程难度也稍高,旧IE不支持。 SVG擅长处理矢量图形,交互容易,旧IE不支持。 CSS3很闪亮,但功能有限,旧IE...
  • 造型与动画——文本演绎的简约与华丽 PPT的魅惑力不在技术,而在想象力。它的无所不能度与使用者的想象力成正比。一个小创意演绎的无穷变幻正是它最迷人的地方。“不怕做不到,就怕想不到”用来描述PPT再合适不过。...
  • 写了一个文字渐变的动画效果,纯CSS动画.文字加了一点阴影效果,看起来有发光哒感觉~ 效果如下图 这里因为是截图,所以没有办法看到动态的效果.大家可以拷贝我下面的代码自己试一试 代码看下面 html <div ...
  • Android实用视图动画及工具系列之:表情加载动画和失败加载动画,人物加载动画,自定义有趣的动画载入视图,适用于各种网络及数据库数据载入显示,主要实现了载入动画和载入失败动画效果,主要功能原理利用了...
  • #include&lt;stdio.h&gt; /* 包含putchar() 相关文件操作 fopen()打开文件 feof()判断文件到结尾 更多查看stdio.h */ #include&lt;stdlib.h&... 用系统时间初始化获取随机数...
  • iOS 常用动画

    千次阅读 2016-11-24 16:47:19
    动画 Core Animation笔记,基本的使用方法 - Core Animation笔记,基本的使用方法:1.基本动画,2.多步动画,3.沿路径的动画,4.时间函数,5.动画组。 awesome-ios-animation - iOS Animation 主流炫酷动画...
  •  增强现实技术AR:--融合了动画、立体视觉和图像处理;--建模、渲染、位置标定、图像融合;2. OpenGL是一用于创建实时3D图像的编程接口。3. 维这个术语表示一个正在描述或显示的物体具有维维度:宽度、...
  • 常见的地图覆盖物为这三种类型,如:popup弹窗、label标注信息、text文本信息等。 上篇讲了overlay的一些属性方法事件等,这篇主要讲overlay三种最常用的案例。更多可以参考上篇内容openlayers6【八】地图覆盖物...
  • IOS 加载动画 进度条
  • 好久没有进行动画系列了,今天我们继续;这次讲解的内容是过度动画;先看看最终动画效果。需求分析:1.... 动画在缩略图的情形下,只有图片没有文本描述信息。2. 动画在执行过程中,图片的圆角也会伴随着动...
  • Android三种方式实现TextView跑马灯效果作为一枚程序猿,能把自己学到的那点可怜的技术记录下来并分享出来真的是件身心愉悦的事情。 以下记录三种方式实现TextView文字滚动的效果。 第一:原生的android自带的...
  • 文本输入布局TextInputLayoutTextInputLayout是MaterialDesign库中对编辑框EditText进行增强的一个控件。众所周知,EditText未输入字符时,我们可以给它显示默认的提示文字hint;可是一旦输入字符,这个hint提示就...
  • DefaultItemAnimator是Android OS中一个默认的RecyclerView动画实现类,如果产品需求没有特别复杂的动画要求,可以使用DefaultItemAnimator实现简单的动画效果。DefaultItemAnimator动画的实现流程和原理已经在上两...
  • 电子商务专业 机械工业出版社 Flash8 动画设计实例教程 本章目录 3.1 文字静态属性设置实例 3.2 文字动画实例 本章重点文本属性面板的设置 本章难点制作文字特效文字变形动画的制作方法 3.1 文字静态属性设置实例 本...
  • Android的动画是由一系列的连续PNG图片作为帧组成的动画形式,是一个文件包,将各帧PNG图片以压缩方式保存。这个保存的文件名就是bootanimation.zip,这个文件是zip压缩文件,压缩方式要求是存储压缩.**开机动画文件...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 137,487
精华内容 54,994
关键字:

动画文本三种方式