精华内容
下载资源
问答
  • Android的三种动画详解(帧动画、View动画、属性动画
    万次阅读 多人点赞
    2019-06-21 22:54:03

    Android的动画分为了三种, 分别是 帧动画、View动画、属性动画。

    1、帧动画

    帧动画就是顺序播放一组预先定义好的图片,就类似于我们观看视频,就是一张一张的图片连续播放。

    帧动画的使用很简单,总共就两个步骤:

    • 1、在res/drawable目录下定义一个XML文件,根节点为系统提供的animation-list,然后放入定义更好的图片;
    • 2、使用AnimationDrawable类播放第一步定义好的Drawable中的图片,形成动画效果;

    代码示例,第一步,创建Drawable文件:

    <?xml version="1.0" encoding="utf-8"?>
    <animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    	android:oneshot="false">
    	<item android:drawable="@drawable/image01" android:duration="500"/>
    	<item android:drawable="@drawable/image02" android:duration="500"/>
    	<item android:drawable="@drawable/image03" android:duration="500"/>
    </animation-list>
    

    上述xml中,有些属性我们要了解到:

    • 1、android:oneshot=“false”: 表示是否重复播放动画,还是只播放一次;
    • 2、每个item都有Drawable和duration属性,Drawable表示我们要播放的图片;duration表示这张图播放的时间;

    代码示例,第二步,用AnimationDrawable播放动画:

        Button button = (Button) findViewById(R.id.bt_001);
        button.setBackgroundResource(R.drawable.frame_animation);//把Drawable设置为button的背景
        //拿到这个我们定义的Drawable,实际也就是AnimationDrawable
        AnimationDrawable animationDrawable = (AnimationDrawable) button.getBackground();
        animationDrawable.start();//开启动画
    

    实际上,从名字也可以看出,AnimationDrawable是一个Drawable的子类,所以我们定义的xml文件也是防在res/rawable目录下的.

    2、View动画(也称补间动画)

    2.1 View动画的基本介绍

    view动画也称为补间动画,因为我们只需要拿到一个view,设定它开始和结束的位置,中间的view会自动由系统补齐,而不需要帧动画每一幅图都是提前准备好的。

    View动画是Android一开始就提供的比较原始的动画,主要支持四种效果:平移、缩放、旋转、透明度变化(渐变) 四种基本效果,我们可以再这四种基础效果的基础上,选择其中的几种进行组合。

    View动画的四种基本效果对应了四个Animation的子类,如下:

    在这里插入图片描述
    比如创建一个平移动画translate_animation.xml, 也是需要把xml文件放在res/anim目录下:

    <?xml version="1.0" encoding="utf-8"?>
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
        android:fromXDelta="100"
        android:fromYDelta="0"
        android:toXDelta="0"
        android:toYDelta="0"/>
    

    scale_animation.xml :

    <?xml version="1.0" encoding="utf-8"?>
    <scale xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="1000"
        android:fromXScale="0.0"
        android:fromYScale="0.0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toXScale="1.0"
        android:toYScale="1.0"/>
    

    pivotX和pivotY表示以缩放中心的位置。

    rotate_animation.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <rotate xmlns:android="http://schemas.android.com/apk/res/android"
          android:fromDegree="0"
          android:toDegree="1800"
          android:pivotX = "50%"
          android:pivotY="50%"
          android:duration = "3000"
    />
    

    渐变动画alpha_animation.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <alpha xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="1000"
        android:fromAlpha="1.0"
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        android:toAlpha="0.0" />
    

    interpolator表示动画插值器, 可以控制动画的变化速率, 比如前200ms很慢,中间600ms很快,最后200ms又很慢。

    pivot 这个属性主要是在translate 和 scale 动画中,这两种动画都牵扯到view 的“物理位置“发生变化,所以需要一个参考点。 而pivotX和pivotY就共同决定了这个点;它的值可以是float或者是百分比数值。
    以 pivotX 为例,说明其取不同的值的含义:

    • 10:距离动画所在view自身左边缘10像素
    • 10% :距离动画所在view自身左边缘 的距离是整个view宽度的10%
    • 10%p:距离动画所在view父控件左边缘的距离是整个view宽度的10%

    除了用xml来设置View动画,也可以用代码直接搞定,如

    Animation translateAnimation = new TranslateAnimation(0,500,0,500);
        // 创建平移动画的对象:平移动画对应的Animation子类为TranslateAnimation
        // 参数分别是:
        // 1. fromXDelta :视图在水平方向x 移动的起始值
        // 2. toXDelta :视图在水平方向x 移动的结束值
        // 3. fromYDelta :视图在竖直方向y 移动的起始值
        // 4. toYDelta:视图在竖直方向y 移动的结束值
        translateAnimation.setDuration(3000);
        // 播放动画直接 startAnimation(translateAnimation)
        //如:
        mButton.startAnimation(translateAnimation);
    

    其他几个动画也类似,就不一一例举,看构造方法即可。

    2.2 View动画的组合动画–AnimationSet

    我们可以使用AnimationSet把View动画的平移、缩放、旋转、渐变都揉在一起,也是既能通过代码实现,也可以通过xml实现

    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"
        >
        <scale
            android:duration="3000"
            android:fromXScale="0.0"
            android:fromYScale="0.0"
            android:pivotX="50%"
            android:pivotY="50%"
            android:toXScale="1.0"
            android:toYScale="1.0"/>
        <alpha
            android:duration="3000"
            android:fromAlpha="1.0"
            android:toAlpha="0.5" />
        <rotate
            android:fromDegrees="0"
            android:toDegrees="720"
            android:pivotX = "50%"
            android:pivotY="50%"
            android:duration = "3000"
            />
        <translate
            android:fromXDelta="0"
            android:toXDelta="100"
            android:fromYDelta="0"
            android:toYDelta="100" />
    </set>
    

    代码实现:

    AnimationSet setAnimation = new AnimationSet(true);
        // 特别说明以下情况
        // 因为在下面的旋转动画设置了无限循环(RepeatCount = INFINITE)
        // 所以动画不会结束,而是无限循环
        // 所以组合动画的下面两行设置是无效的, 以后设置的为准
        setAnimation.setRepeatMode(Animation.RESTART);
        setAnimation.setRepeatCount(1);// 设置了循环一次,但无效
    
        // 旋转动画
        Animation rotate = new RotateAnimation(0,360,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
        rotate.setDuration(1000);
        rotate.setRepeatMode(Animation.RESTART);
        rotate.setRepeatCount(Animation.INFINITE);
    
        // 平移动画
        Animation translate = new TranslateAnimation(TranslateAnimation.RELATIVE_TO_PARENT,-0.5f,
                TranslateAnimation.RELATIVE_TO_PARENT,0.5f,
                TranslateAnimation.RELATIVE_TO_SELF,0
                ,TranslateAnimation.RELATIVE_TO_SELF,0);
        translate.setDuration(10000);
    
        // 透明度动画
        Animation alpha = new AlphaAnimation(1,0);
        alpha.setDuration(3000);
        alpha.setStartOffset(7000);
    
        // 缩放动画
        Animation scale1 = new ScaleAnimation(1,0.5f,1,0.5f,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
        scale1.setDuration(1000);
        scale1.setStartOffset(4000);
    
        // 将创建的子动画添加到组合动画里
        setAnimation.addAnimation(alpha);
        setAnimation.addAnimation(rotate);
        setAnimation.addAnimation(translate);
        setAnimation.addAnimation(scale1);
        // 使用
        mButton.startAnimation(setAnimation);
    

    2.3 View动画的使用场景

    场景一:LayoutAnimation

    LayoutAnimation作用于ViewGroup,为ViewGroup指定一个动画,然后,当它的子元素出场时都会具有这种效果。这种效果常用与ListView,有的ListView的每个item都以一定的动画形式出现,就是用到的LayoutAnimation。

    LayoutAnimation也是一个View动画, 使用方式有三步:

    • 1、定义LayoutAnimation的xml文件;
    • 2、指定具体的入场动画;
    • 3、为ViewGroup指定android:layoutAnimation属性,引用这个LayoutAnimation的xml文件;

    第一步,定义LayoutAnimation的xml文件:

    // res/anim/anim_layout.xml
    <layoutAnimation
    	xmlns:android="http://schemas.android.com/apk/res/android"
    	android:delay="0.5"
    	android:animationOrder="normal"
    	android:animation="@anim/anim_item"/>
    

    其中animationOrder有三种选项: normal、reverse、random。

    第二步,指定具体动画,也就是第一步中引用的anim_item:

    // res/anim/anim_item.xml
    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android"
    	android:duration="300"
    	android:interpolator="@android:anim/accelerate_interpolator"
    	android:shareInterpolator="true" >
    	<alpha
    	android:fromAlpha="0.0"
    	android:toAlpha="1.0" />
    	<translate
    	android:fromXDelta="500"
    	android:toXDelta="0" />
    </set>
    

    第三步,为ViewGroup指定android:layoutAnimation属性:

    <ListView
    	android:id="@+id/list"
    	android:layout_width="match_parent"
    	android:layout_height="match_parent"
    	android:layoutAnimation="@anim/anim_layout"
    	android:background="#fff4f7f9"
    	android:cacheColorHint="#00000000"
    	android:divider="#dddbdb"
    	android:dividerHeight="1.0px"
    	android:listSelector="@android:color/transparent" />
    

    这样,ListView的每个item都具有了动画效果。

    除了用xml文件,也同样可以使用代码实现, 代码需要用到LayoutAnimationController:

    ListView listView = (ListView) layout.findViewById(R.id.list);
    Animation animation = AnimationUtils.loadAnimation(this,R.anim.anim_
    item);
    LayoutAnimationController controller = new LayoutAnimationController
    (animation);
    controller.setDelay(0.5f);
    controller.setOrder(LayoutAnimationController.ORDER_NORMAL);
    listView.setLayoutAnimation(controller);
    

    2.4动画的监听

    Animation.addListener(new AnimatorListener() {
          @Override
          public void onAnimationStart(Animation animation) {
              //动画开始时执行
          }
    
           @Override
          public void onAnimationRepeat(Animation animation) {
              //动画重复时执行
          }
    
         @Override
          public void onAnimationCancel()(Animation animation) {
              //动画取消时执行
          }
    
          @Override
          public void onAnimationEnd(Animation animation) {
              //动画结束时执行
          }
      });
    

    场景二:Activity的切换效果

    Activity有默认的切换效果,但是我们可以定制,主要用到overridePendingTransition(int enterAnima, int exitAnima)这个方法:

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

    注意, 这个方法必须在startActivity或者finish方法之后调用才会生效。

    场景三:Fragment的切换效果

    可以使用FragmentTransaction的setCustomAnimation方法添加切换动画。

    3、属性动画

    属性动画可以看作是增强版的补间动画,与补间动画的不同之处体现在:

    • 补间动画只能定义两个关键帧在透明、旋转、位移和倾斜这四个属性的变换,但是属性动画可以定义任何属性的变化。
    • 补间动画只能对 UI 组件执行动画,但属性动画可以对任何对象执行动画。

    与补间动画类似的是,属性动画也需要定义几个方面的属性:

    • 动画持续时间。默认为 300ms,可以通过 android:duration 属性指定。
    • 动画插值方式。通过 android:interploator 指定。
    • 动画重复次数。通过 android:repeatCount 指定。
    • 重复行为。通过 android:repeatMode 指定。
    • 动画集。在属性资源文件中通过 <set …/> 来组合。
    • 帧刷新率。指定多长时间播放一帧。默认为 10 ms。

    属性动画 API

    • Animator: 提供创建属性动画的基类,基本不会直接使用这个类。
    • ValueAnimator:属性动画用到的主要的时间引擎,负责计算各个帧的属性值,基本上其他属性动画都会直接或间接继承它;
    • ObjectAnimator: ValueAnimator 的子类,对指定对象的属性执行动画。
    • AnimatorSet:Animator 的子类,用于组合多个 Animator。

    除了这些 API,属性动画还提供了一个 Evaluator ,用来控制属性动画如何计算属性值。

    • IntEvaluator:计算 int 类型属性值的计算器。
    • FloatEvaluator: 用于计算 float 类型属性值的计算器。
    • ArgbEvaluator: 用于计算十六进制形式表示的颜色值的计算器。
    • TypeEvaluator: 可以自定义计算器。

    使用 ValueAnimator 创建动画的步骤:

    • 调用 ValueAnimator 的 ofInt()、ofFloat() 或者 ofObject() 静态方法创建 ValueAnimator 实例。
    • 调用 ValueAnimator 的 setXxx() 等方法设置持续时间,插值方式、重复次数等。
    • 调用 ValueAnimator 的 start() 方法启动动画。
    • 为 ValueAnimator 注册 AnimatorUpdateListener 监听器,在该监听器中可以监听 ValueAnimator 计算出来的值改变,并将这些值应用到指定对象上。

    属性动画的一般使用:

    定义属性动画和补间动画等类似,有两种方式

    • 使用 ValueAnimator 或者 ObjectAnimator 的静态工厂方法创建动画。
    • 使用资源文件来定义动画。

    属性动画的使用:

    • 创建 ValueAnimator 或 ObjectAnimator 对象 —— 即可以从 XML 资源文件加载该动画也可以直接调用 ValueAnimator 或者 ObjectAnimator 的静态工厂方法创建动画。
    • 根据需要为 Animator 对象设置属性。
    • 如果需要监听 Animator 的动画开始事件,动画结束事件、动画重复事件、动画值改变事件,并根据事件提供响应处理代码,需要为Animator 对象设置监听器。
    • 如果有多个动画需要同时播放,需要使用 AnimatorSet 组合这些动画。
    • 调用 Animator 对象的 start 启动动画。

    代码示例:

    private void startAnim() {
        ObjectAnimator animator0 = ObjectAnimator.ofFloat(
                mImageViews.get(0),//这里传入的是一个任意对象,此处是imageview对象
                "alpha",
                1F,
                0.5F);
        ObjectAnimator animator1 = ObjectAnimator.ofFloat(
                mImageViews.get(1),
                "translationY",
                200F);
        ObjectAnimator animator2 = ObjectAnimator.ofFloat(
                mImageViews.get(2),
                "translationX",
                200F);
        ObjectAnimator animator3 = ObjectAnimator.ofFloat(
                mImageViews.get(3),
                "translationY",
                -200F);
        ObjectAnimator animator4 = ObjectAnimator.ofFloat(
                mImageViews.get(4),
                "translationX",
                -200F);
        AnimatorSet set = new AnimatorSet();
        set.setDuration(500);
        set.setInterpolator(new BounceInterpolator());
        set.playTogether(
                animator0,
                animator1,
                animator2,
                animator3,
                animator4);
        set.start();
        mFlag = false;
    }
    

    总结

    以上就是Android的帧动画、view动画和属性动画的用法。

    那除了这三种动画,我们是否还有其他动画机制呢?或者说有什么变种呢?

    这个问题,将在下一篇博客,Android除了三大动画,还有哪些动画? 再进行分析。

    更多相关内容
  • 如何使用python制作简单的动画

    千次阅读 2021-02-05 11:26:22
    Python真的是无穷的好用,涉及内容非常广泛,比如接下来给大家介绍的制作动画,就可以利用python实现,相信小伙伴们听到这些内容肯定是非常感兴趣的,至于怎么去实现?大家想不想了解呢?下面小编就给大家整理出来了...

    Python真的是无穷的好用,涉及内容非常广泛,比如接下来给大家介绍的制作动画,就可以利用python实现,相信小伙伴们听到这些内容肯定是非常感兴趣的,至于怎么去实现?大家想不想了解呢?下面小编就给大家整理出来了,一起来看吧~

    制作步骤:

    在一开始导入我们的库,turtle (绘制几何图形),random (产生随机颜色和高度值)import turtle as t #导入turtle库,并该起了个外号为t

    import random as r

    编写一个画长方形的自定义函数,rect()。4个参数分别是长方形的高,颜色,x,y坐标值。def rect(h, c, x, y):

    t.goto(x, y)        #画笔移到特定位置

    t.fillcolor(c)       #设置填充颜色

    t.begin_fill()

    for i in range(2):  #画长方形

    t.fd(20)

    t.lt(90)

    t.fd(h)

    t.lt(90)

    t.end_fill()

    f3a4d2a1179ced584f0202fc1185f791.png

    绘制16个长方形,先要产生16种随机颜色存放到列表c中,形成静态条形图。c = []

    for i in range(16):  #设置16中随机颜色

    c.append((r.random(),r.random(),r.random()))

    t.speed(11)         #绘图的速度设置为11

    x = -180

    t.tracer(False)     #关闭轨迹快速绘图

    for i in range(16):

    h = r.randint(20,220)

    rect(h, c[i], x, 0)

    x = x   20        #下一个长方形x坐标值

    dd53c86d3605f1c90b25c61d3e767a82.png

    绘制6666幅静态条形图图案,并且注意停留时间的技巧。for j in range(6666): #绘制6666次

    x = -180

    t.tracer(False)

    for i in range(16):

    h = r.randint(20,220)

    rect(h, c[i], x, 0)

    x = x   20

    t.tracer(True)   #打开轨迹让绘制速度变慢

    t.circle(1)         #画一个半径为1像素的圆,为了停留一段时间

    t.tracer(False)

    t.clear()

    总结:

    理解整个目标动画的关键在完整代码的最后4句。通过笔迹显示和画一个小圆为每幅图争取停留时间,可以调节我们动画的快慢。最后接到要清屏t.clear()。t.tracer(True)

    t.circle(1)

    t.tracer(False)

    t.clear()

    以上就是全部内容了,大家可以学习了解下。

    展开全文
  • Java UI 框架提供了帧动画、数值动画和属性动画,并提供了将多个动画同时操作的动画集合。 二、帧动画动画是利用视觉暂留现象,将一系列静止的图片按序播放,给用户产生动画的效果。 在“Project”窗口,打开...

    一、概述

    • 动画是组件的基础特性之一,精心设计的动画使UI变化更直观,有助于改进应用程序的外观并改善用户体验。
    • Java UI 框架提供了帧动画、数值动画和属性动画,并提供了将多个动画同时操作的动画集合。

    二、帧动画

    • 帧动画是利用视觉暂留现象,将一系列静止的图片按序播放,给用户产生动画的效果。
    • 在“Project”窗口,打开“entry > src > main > resources > base > media”,添加一系列图片至“media”目录下:

    在这里插入图片描述

    • 在“graphic”目录下,新建“animation_element.xml”文件,在 XML 文件中使用 animation-list 标签来配置图片资源,duration 用来设置显示时长,单位为毫秒。oneshot 表示是否只播放一次:
    	<?xml version="1.0" encoding="utf-8"?>
    	<animation-list xmlns:ohos="http://schemas.huawei.com/res/ohos"
    	                ohos:oneshot="false">
    	    <item ohos:element="$media:01" ohos:duration="100"/>
    	    <item ohos:element="$media:02" ohos:duration="100"/>
    	    <item ohos:element="$media:03" ohos:duration="100"/>
    	    <item ohos:element="$media:04" ohos:duration="100"/>
    	    <item ohos:element="$media:05" ohos:duration="100"/>
    	    <item ohos:element="$media:06" ohos:duration="100"/>
    	    <item ohos:element="$media:07" ohos:duration="100"/>
    	    <item ohos:element="$media:08" ohos:duration="100"/>
    	    <item ohos:element="$media:09" ohos:duration="100"/>
    	    <item ohos:element="$media:10" ohos:duration="100"/>
    	    <item ohos:element="$media:11" ohos:duration="100"/>
    	    <item ohos:element="$media:12" ohos:duration="100"/>
    	</animation-list>
    
    • 在 Java 代码中,获取动画资源:
    	FrameAnimationElement frameAnimationElement = new FrameAnimationElement(getContext(), ResourceTable.Graphic_animation_element);
    
    • 创建一个组件用于承载帧动画:
    	Component component = new Component(getContext());
    	component.setWidth(500);
    	component.setHeight(500);
    	component.setBackground(frameAnimationElement);
    
    • 启动动画:
    	frameAnimationElement.start();
    
    • 帧动画效果如图所示:

    在这里插入图片描述

    三、数值动画

    • AnimatorValue 数值从 0 到 1 变化,本身与 Component 无关。开发者可以设置 0 到 1 变化过程的属性,例如:时长、变化曲线、重复次数等,并通过值的变化改变组件的属性,实现组件的动画效果。
    ① 声明 AnimatorValue
    • Java 方式如下:
    	AnimatorValue animatorValue = new AnimatorValue();
    
    • XML 方式:在 resource/base/animation 文件夹下声明名为“animator_value.xml”的 XML 文件。但是,目前 XML 方式只支持 delay 和 duration 属性,其他属性均需通过 Java 代码设置,因此建议采用 Java 方式。
    	<?xml version="1.0" encoding="UTF-8" ?>
    	<animator xmlns:ohos="http://schemas.huawei.com/res/ohos"
    	                  ohos:delay="1000"
    	                  ohos:duration="2000"/>
    
    ② 使用数值动画
    • Java方式:设置变化属性:
    	animatorValue.setDuration(2000);
    	animatorValue.setDelay(1000);
    	animatorValue.setLoopedCount(2);
    	animatorValue.setCurveType(Animator.CurveType.BOUNCE);
    
    • XML 方式:解析 XML 数值动画文件并使用:
    	AnimatorScatter scatter = AnimatorScatter.getInstance(getContext());
    	Animator animator = scatter.parse(ResourceTable.Animation_animator_value);
    	if (animator instanceof AnimatorValue) {
    	    AnimatorValue animatorValue = (AnimatorValue) animator;
    	    animatorValue.setLoopedCount(2);
    	    animatorValue.setCurveType(Animator.CurveType.BOUNCE);
    	}
    
    ③ 添加回调事件
    	animatorValue.setValueUpdateListener(new AnimatorValue.ValueUpdateListener() {
    	    @Override
    	    public void onUpdate(AnimatorValue animatorValue, float value) {
    	        button.setContentPosition((int) (800 * value), button.getContentPositionY());
    	    }
    	});
    
    ④ 启动动画或对动画做其他操作
    	animatorValue.start();
    
    ⑤ 数值动画效果

    在这里插入图片描述

    四、属性动画

    • 为 Component 的属性设置动画是非常常见的需求,Java UI 框架可以为 Component 设置某个属性或多个属性的动画。
    ① 声明 AnimatorProperty
    • Java 方式:
    	AnimatorProperty animatorProperty = image.createAnimatorProperty();
    
    • XML 方式:在 resource/base/animation 文件夹下声明名为“animator_property.xml”的 XML 文件。但是,目前 XML 方式只支持 delay 和 duration 属性,其他属性均需通过 Java 代码设置,因此建议采用 Java 方式:
    	<?xml version="1.0" encoding="UTF-8" ?>
    	<animatorProperty xmlns:ohos="http://schemas.huawei.com/res/ohos"
    	                  ohos:delay="500"
    	                  ohos:duration="2500"/>
    
    ② 使用属性动画
    • Java 方式:设置变化属性,可链式调用:
    	animatorProperty.moveFromX(50).moveToX(1000).rotate(90).alpha(0).setDuration(2500).setDelay(500).setLoopedCount(5);
    
    • XML 方式:解析 XML 属性动画文件并使用:
    	AnimatorScatter scatter = AnimatorScatter.getInstance(getContext());
    	Animator animator = scatter.parse(ResourceTable.Animation_animator_property);
    	if (animator instanceof AnimatorProperty) {
    	    AnimatorProperty animatorProperty = (AnimatorProperty) animator;
    	    animatorProperty.setTarget(component);
    	    animatorProperty.moveFromX(50).moveToX(1000).rotate(90).alpha(0).setLoopedCount(5);
    	}
    
    ③ 启动动画或对动画做其他操作
    • 在页面显示时启动动画:
    	image.setBindStateChangedListener(new Component.BindStateChangedListener() {
    	    @Override
    	    public void onComponentBoundToWindow(Component component) {
    	        animatorProperty.start();
    	    }
    	
    	    @Override
    	    public void onComponentUnboundFromWindow(Component component) {
    	        animatorProperty.stop();
    	}});
    
    • 在点击事件中启动动画:
    	image.setClickedListener(component -> animatorProperty.start());
    
    ④ 属性动画效果

    在这里插入图片描述

    四、动画集合

    ① 组合动画
    • 如果需要使用一个组合动画,可以把多个动画对象进行组合,并添加到使用 AnimatorGroup 中。
    • AnimatorGroup 提供了两个方法:runSerially() 和 runParallel(),分别表示动画按顺序开始和动画同时开始。(注:动画集合暂不支持 XML 使用方式)
    • 声明 AnimatorGroup:
    	AnimatorGroup animatorGroup = new AnimatorGroup();
    
    • 添加要按顺序或同时开始的动画:
    	// 4个动画按顺序播放
    	animatorGroup.runSerially(am1, am2, am3, am4);
    	// 4个动画同时播放
    	animatorGroup.runParallel(am1, am2, am3, am4);
    
    • 启动动画或对动画做其他操作:
    	animatorGroup.start();
    
    ② 灵活处理
    • 为了更加灵活处理多个动画的播放顺序,例如一些动画顺序播放,一些动画同时播放,Java UI 框架提供了更方便的动画 Builder 接口。
    • 声明 AnimatorGroup.Builder:
    	AnimatorGroup.Builder animatorGroupBuilder = animatorGroup.build();
    
    • 按播放顺序添加多个动画:
    	// 4个动画的顺序为: am1 -> am2/am3 -> am4
    	animatorGroupBuilder.addAnimators(am1).addAnimators(am2, am3).addAnimators(am4)
    
    • 启动动画或对动画做其他操作:
    	animatorGroup.start();
    
    • 动画集合效果如下:

    在这里插入图片描述

    五、完整示例

    展开全文
  • Unity动画系统详解1:在Unity中如何制作动画

    千次阅读 多人点赞 2020-05-17 15:32:34
    Unity场景中的物体可以通过制作动画,让物体动起来。简单的动画如物体的移动、旋转(比如旋转的风扇、闪烁不定的灯泡等),复杂的动画如游戏中角色的动作、面部表情等。 洪流学堂,让你快人几步。你好,我是跟着大...

    摘要:在场景中加入动态的物体,可以让整个场景更加生动、真实。Unity场景中的物体可以通过制作动画,让物体动起来。简单的动画如物体的移动、旋转(比如旋转的风扇、闪烁不定的灯泡等),复杂的动画如游戏中角色的动作、面部表情等。

    洪流学堂,让你快人几步。你好,我是跟着大智学Unity的萌新,我叫小新,这几周一起来复(yu)习(xi)动画系统。

    包含动画的场景

    小新:“智哥,我想在场景里加上一个旋转的风扇怎么做啊?现在做的模型都是静态的。”

    大智:“这就需要用到动画系统了。在场景中加入动态的物体,会让整个场景更加生动、真实。除了上周学过的粒子效果外,场景中的物体也可以通过制作动画,让物体动起来。简单的动画如物体的移动、旋转(比如旋转的风扇、闪烁不定的灯泡等),复杂的动画如游戏中角色的动作、面部表情等。”

    动画系统

    Unity中的动画主要是三种来源:

    • 在Unity引擎中制作动画
    • 从外部工具(如3ds Max、Maya等)导入动画
    • 使用代码制作的动画

    下面讨论的主要是前两种来源的动画,使用代码写动画我们后面再学习。

    Unity中内置了强大的动画系统,可以支持在Unity内制作动画,也支持从外部导入动画。

    动画系统基于一种名为Animation Clip(动画剪辑)的资源,这些资源以文件的形式存在工程中。这些文件内的数据记录了物体如何随着时间移动、旋转、缩放,物体上的属性如何随着时间变化。每一个Clip文件是一段动画。

    这些动画可以在Unity中直接制作,也可以由美术同学在3D建模软件中制作并导入到Unity中。

    在Unity中制作动画

    在Unity中制作动画需要用到Animation窗口,可以通过菜单栏Window > Animation打开Animation窗口。

    通过这个窗口可以创建、编辑动画,也可以查看导入的动画。Animation窗口同一时间只能查看、编辑同一段Clip中的动画。Animation适合单个物体(及其子物体)的动画编辑。咱们最近刚学的Timeline系统,适合同时对场景中多个物体制作复杂动画,还能包含音频,自定义的动画内容。

    在Unity中制作动画一般分为以下几个步骤:
    1、打开Animation窗口
    2、选中要制作动画的物体
    3、创建新的动画Clip
    4、编辑、预览、修改动画

    创建新的Animation Clip

    选中要制作动画的物体,这时候Animation窗口会有以下两种状态:
    状态1:该物体上没有动画,可以点击Animation窗口中间的Create按钮创建动画Clip。

    物体上没有动画的情况

    状态2:该物体上已经有动画,会在窗口中显示一段动画的关键帧。可以通过左上角的菜单切换预览动画、创建新动画。可以点击Create New Clip…来创建新的动画Clip,如下图所示。

    物体上有动画的情况

    点击完创建新的动画Clip后,会弹出一个文件对话框,可以设置保存动画Clip的位置。(为了保持工程文件目录的整洁,不要保存在工程根目录,建议保存在Animations文件夹中)

    保存完毕后,原先没有动画的物体上会自动附加一个Animator组件,这个组件是做什么的呢?

    Animator组件

    Animation Clip只是一段动画数据,你可以把它类比成视频文件,而Animator组件是一个播放器,用来控制动画的播放、多个动画片段之间的切换等。

    Animator窗口

    **Animator组件的第一个属性是Controller,对应到工程目录中的文件是一个Animator Controller类型的文件,可以在这个文件中定义动画Clip之间如何进行切换。**双击这个文件会打开Unity的Animator窗口,显示该文件中的内容。后面会细讲Animator组件。

    制作动画

    创建了动画Clip后,就可以开始制作动画了。

    Animation窗口有两种模式:录制模式和预览模式。

    点击图中红色按钮进入录制模式,时间轴会显示为红色

    点击图中Preview按钮进入预览模式,时间轴会显示为浅蓝色。在时间轴上点击也会自动进入预览模式

    在录制模式下,当你对物体进行改动时(例如移动、旋转、缩放、修改属性等),Unity会自动在当前时间位置生成关键帧,记录修改的属性。

    在预览模式下,修改物体不会自动创建/修改关键帧,如果需要创建/修改关键帧,你需要手动点击添加关键帧按钮。

    录制关键帧

    点击录制按钮后,就进入了录制状态。

    可以通过在时间轴上拖动修改当前所在的时间位置。

    在时间轴上拖动修改当前时间

    也可以通过修改当前帧数输入框中的数字,修改时间轴的位置。默认情况下,动画的帧速率是60,即每秒播放60帧。如果设置当前帧数为30,就是0.5秒的位置。

    在录制模式下,不管是在场景中移动、旋转、缩放物体,还是在Inspector面板中修改物体组件的属性(Unity动画支持的属性),Unity都会自动在动画Clip的当前时间上添加关键帧保存。

    当前被记录的属性,在Inspector上会以红色背景显示

    编辑动画

    编辑完动画后,可以再次点击录制按钮退出录制模式,避免后续对物体的操作被记录到动画中。

    现在你会看到在Animation窗口中,左侧多处很多个属性,这些属性就是所有被记录的属性列表。你也可以通过点击下方的Add Property按钮手动添加需要被动画记录的属性。

    手动创建关键帧

    如果没有在录制模式下,对物体的修改不会自动记录到动画Clip中。如果需要记录,需要手动添加关键帧进行记录。

    如果在Inspector中修改了物体的属性,物体的属性会从浅蓝色背景变为浅红色,代表该属性已经被修改。这时候你可以右键点击对应的属性,在弹出菜单中点击Add Key即可添加关键帧,将该属性的数据保存到动画Clip中。如果你在当前帧修改了多个属性,可以点击菜单中的Key All Modified(将所有修改的属性记录关键帧)或Key All Animated(记录属性列表中所有属性的数值,即使与上一帧相同数值的属性也会被记录)来一次性将所有修改的属性保存。

    属性上的右键菜单

    也可以点击Animation窗口左侧的Add Keyframe按钮来记录当前属性列表中选中属性的关键帧,如果当前没有选中任何属性,则会记录所有属性。如下图所示。

    小技巧
    添加关键帧也有快捷键哦,记住快捷键能大幅提高制作动画的效率。

    • K Key All Animated,将记录当前属性列表中选中属性的关键帧,如果当前没有选中任何属性,则会记录所有属性。
    • Shift + K Key All Modified,将动画属性列表中所有已修改的属性的数值记录为关键帧。

    使用曲线编辑动画

    默认情况下,Animation窗口是DopeSheet模式,显示的是关键帧的点。可以通过点击下方的Curves切换为曲线模式,进一步调节关键帧之间的数值是如何过渡的。

    切换到Curves模式后,出现的曲线编辑框和我们之前在粒子系统模块学到的用法是一样的,在这就不重复了。

    可以在左侧属性列表选中一条或多条曲线进行编辑。

    小技巧
    别忘了F的妙用,F键可以让曲线充满整个窗口,这在不同属性的曲线之间切换时非常有用。

    编辑关键帧

    编辑关键帧时,可以多选(在Curve编辑中同理):

    • 按住Shift或Ctrl,再点击关键帧可以选中多个关键帧
    • 通过框选多选关键帧
    • 按住Shift或Ctrl的同时框选,可以添加或移除框选住的关键帧

    框选关键帧

    批量移动关键帧

    批量缩放关键帧

    Ripple Edit 波纹编辑

    你会发现直接拖拽多个关键帧时,后方的关键帧并不会跟随这些关键帧移动。如果你想让后方的关键帧也跟着移动,可以按住R键,同时拖拽这些关键帧。这种编辑方式叫做Ripple Edit(在音视频编辑软件中很常见)。缩放同理。

    Ripple Edit

    预览动画效果

    点击Animation窗口中的播放按钮,就可以在Scene中预览动画。

    在游戏运行时播放动画

    今天做出来的动画,在点击Play按钮以后就会自动循环播放了。如果不想让它循环播放,可以选中Animation Clip文件,取消Loop的勾选。

    如果不想让这段动画自动播放,那就需要修改Animator Controller啦,接着往下学吧!

    总结

    大智:“敲黑板,今天讲了如何使用Unity内的Animation给物体做动画,希望你能记住一下几点:”

    • Animation Clip是Unity中保存动画的资源文件,保存在工程中。
    • Animator是Animation Clip的播放器。
    • Animator Controller是一个“导演”,类似“播放列表”,用来指导Animator如何播放其中的Animation Clip

    如果你想降伏动画系统这个法宝,快去学习修炼吧,这里有完整的攻略

    今日思考题

    大智:“动手创建一个简单的动画试一试吧!”
    小新:“好嘞~”
    大智:“收获别忘了分享出来!别忘了分享给你的朋友,也许能够帮到他。”

    扩展阅读

    【建议收藏】找不到免费的角色动画?来试试mixamo
    5分钟制作过场动画
    5分钟入门Cinemachine智能相机系统
    Unity编辑器录屏神器:Unity Recorder

    【扩展学习】洪流学堂公众号回复动画可以阅读本系列所有文章,更有视频教程等着你!


    呼~ 今天小新絮絮叨叨的真是够够的了。没讲清楚的地方欢迎评论,咱们一起探索。

    我是大智(微信:zhz11235),你的技术探路者,下次见!

    别走!点赞收藏哦!

    好,你可以走了。

    展开全文
  • 《Windows界面编程第六篇 动画启动效果(动画效果显示及隐藏窗口)》 http://blog.csdn.net/morewindows/article/details/8656068 配套程序。 能动画方式显示和隐藏窗口和对话框程序,能用于Win32和MFC程序中。
  • 动画:用动画给面试官解释 TCP 三次握手过程

    万次阅读 多人点赞 2019-10-12 07:55:38
    来源 | 公众号:小鹿动画学编程 写在前边 TCP 三次握手过程对于面试是必考的一个,所以不但要掌握 TCP 整个握手的过程,其中有些小细节也更受到面试官的青睐。 对于这部分掌握以及 TCP 的四次挥手,小鹿将会以...
  • Android 动画之帧动画

    万次阅读 2018-06-07 11:34:29
    1.简介   帧动画非常容易理解,其实就是简单的由N...而Android中实现帧动画,一般我们会用到AnimationDrawable 先编写好Drawable,然后代码中调用start()以及stop()开始或停止播放动画。       2.代码实现...
  • 今天我们主要来模仿一下美团中加载数据时小人奔跑的效果,取个有趣的名字就是Running Man,奔跑吧,兄弟!
  • 详解Canvas动画部分

    万次阅读 多人点赞 2020-06-29 14:02:45
    本文包括缩放,平移,旋转、动画等复杂动画
  • Canvas线条动画

    千次阅读 多人点赞 2020-09-03 19:23:39
    没有谁天生就会,用这个动画为你的Canvas小结。 如果你觉得我的代码还算有趣,在你的学习中能有所帮助,请查看我的置顶文章,我由衷感谢! <!DOCTYPE html> <html lang="en"> <head> <...
  • flash做动画教程(基础篇)

    万次阅读 多人点赞 2018-11-01 15:41:02
    可以右击空白的文档,作如下操作: 一 、改变文档的背景颜色 二、根据自己制作gif动态图片的大小,来选择文档的宽高 二、新建元件或者是导入外部图片 有的图片是不需要自己加工的素材就从外部导入 导入...
  • Shader动画之UV动画与顶点动画

    千次阅读 2017-12-18 20:40:08
    用Shader实现动画主要包括两种方式:1.UV动画,2.顶点动画
  • Android ListView Item滑动进入动画效果

    热门讨论 2015-08-26 23:12:06
    Android ListView Item滑动进入动画效果,仿照的事窝牛装修app的动画,很酷炫。参考我的博客:http://blog.csdn.net/zuiwuyuan?viewmode=list
  • 30分钟轻松制作HTML5交互动画

    万人学习 2016-11-08 11:24:00
    30分钟轻松制作HTML5交互动画,完全零代码,初级就能学会。本教程从浅入深,建议从头开始,认真学习每一集。
  • 免费动画毕设源文件 三分钟flash动画源文件下载

    千次下载 热门讨论 2013-07-15 22:07:54
    免费动画毕设源文件 三分钟flash动画源文件下载
  • Android高仿QQ搜索框动画效果

    千次下载 热门讨论 2014-01-15 10:10:13
    鄙人,反复研究qq动画,虽未能有所成,但是一些基本的也都研究明白了,比如手机QQ里的搜索框点击效果,我反复观察,发现居然是一个动画效果。这里是由本人亲手写的,代码简单明了,在模拟器上一跑便知。
  • 利用matlab制作光栅动画(莫尔条纹动画

    千次阅读 多人点赞 2019-12-05 22:05:15
    这种动画不依赖于电子媒体以及gif图,只需要一个事先准备好的底片,以及一个印在透明塑料片上的光栅图案,即可体验到动图的效果(当然电子版的ppt也可以)。 本文尝试分析光栅动画的原理,并通过该原理利用matlab...
  • 为什么 CSS 动画比 JavaScript 高效?

    千次阅读 多人点赞 2021-08-25 13:51:24
    讲到动画,当然是非常有意思的啦,你可以往上滑一下,看看上面的封面图,是不是相当的炫酷,以为我是代码写出来的吗? 那当然不可能啊,我这么摸鱼,怎么会为了个封面图上号呢 废话不多说,其实上面的动图用代码实现...
  • 用js实现动画

    万次阅读 2019-03-01 20:01:35
    1. 体验动画 &lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head lang="en"&gt; &lt;meta charset="UTF-8"&gt; &lt;title&gt;&lt;/title&gt; &...
  • 前言 前段时间,写了篇博客关于Python自制一款炫酷音乐播放器。有粉丝问我,音乐播放器为什么要用PyQt5,效果是不是比...总体来说,我们需要实现将自己喜欢的动态图gif或者视频转成一个桌面动画挂件, 并且可以通过鼠
  • Android 动画之帧动画用法详解

    万次阅读 2020-04-21 23:24:50
    本文目录帧动画概念帧动画实现方法1:xml实现帧动画第一步:导入帧动画素材第二步:创建帧动画文件第三步:布局文件和Activity方法2:用Java代码实现帧动画动画概念 在Android中,帧动画的本质是把一组预先准备好...
  • 文章目录Vue中的基本动画实现动画类名的重定义使用第三方的动画库我就选择其中一个库示范其他都一样 Vue中的基本动画实现 直接一点,基本动画的步骤 在需要加动画的地方,加入transition <transition> &...
  • 【开发工具】Blender制作简单动画

    万次阅读 多人点赞 2019-01-09 16:31:21
        今天给大家介绍一款3D动画制作软件,Blender 是一款开源的跨平台全能三维动画制作软件,提供从建模、动画、材质、渲染、到音频处理、视频剪辑等一系列动画短片制作解决方案。     Blender 拥有方便在...
  • 墨迹天天动画

    千次下载 热门讨论 2014-03-22 17:31:20
    周末升级了墨迹天气,看着引导界面的不错,模仿一下,可能与原作者的代码实现不一样,但是实现的效果还是差不多的。 http://blog.csdn.net/xyz_lmn/article/details/21799725
  • Unity动画系统详解3:如何播放、切换动画

    万次阅读 多人点赞 2020-05-31 19:37:49
    摘要:【长文预警,建议先收藏】有了模型和多个动画以后,在Unity中如何控制它们的...还可以用代码写动画,不过我不会,嘿嘿” 大智:“没错,前两天我们学习的其实主要是Animation Clip的内容,也就是一个物体对应的一
  • Android动画集合开源APP

    千次下载 热门讨论 2014-01-13 22:56:25
    BaseAnimation,如果有新版本会自动提醒大家更新,也希望大家多多贡献自己的动画xml文件或者其他源码,一起来打造这个开源的app 博客地址:http://blog.csdn.net/duguang77/article/details/18230867
  • RecyclerView item 展开动画效果的实现前文提要:1.相关说明:1-1.布局文件:1-2.动画工具类说明(代码我基本上都添加了注释):1-3.问题:2.如何使用:2-1.viewHoler 需要实现 ExpandableViewHoldersUtil....
  • Inventor制作动画

    千次阅读 2018-08-14 16:58:04
    前言:用Inventor两年了,一直都用...在render(渲染)菜单下,可以完成动画制作的整个流程。 第二:点击components,用鼠标选择需要进行动作的零件。 编辑移动的距离和旋转的角度,以及运动的时间和加速度。...
  • MATLAB动画绘制

    万次阅读 多人点赞 2017-08-22 17:32:39
    Matlab动画制作 Matlab的动画制作: 质点动画:最简单的动画产生方式,产生一个顺着曲线轨迹运动的质点来操作。 电影动画:首先保存一系列的图形,然后按照一定的顺序像电影一样的播放。 程序动画:在图形窗口中...
  • iOS之深入探究动画渲染降帧

    万次阅读 2021-10-16 20:50:40
    但是另一方面,我们也知道动画渲染的过程中需要消耗大量的 GPU 资源,所以给动画降帧则可以给 GPU 减负,降低 GPU 使用率峰值。 所以给动画降帧,实际上是一种用体验换性能的决策,在动画不复杂但是数量很多的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 836,088
精华内容 334,435
关键字:

可画可以做动画吗

友情链接: SIFT-opencv249.zip