精华内容
下载资源
问答
  • 安全模式或开发者模式动画程序关闭动画时长缩放,动画最好不要执行。 执行动画的结果:循环动画会闪烁,缩放动画不会执行。 解决:在安全模式或开发者模式动画程序关闭动画时长缩放时,不要执行动画。 1、...

    安全模式或开发者模式动画程序关闭动画时长缩放,动画最好不要执行。


    执行动画的结果:循环动画会闪烁,缩放动画不会执行。


    解决:在安全模式或开发者模式动画程序关闭动画时长缩放时,不要执行动画。

    1、PowerManager.isPowerSaveMode()

    2、Settings.Global.ANIMATOR_DURATION_SCALE


    boolean isPowerSaveMode() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            if (mPowerManager.isPowerSaveMode()) {
                return true;
            }
        }
        return isAnimatorDurationScale();
    }
    
    private boolean isAnimatorDurationScale() {
       float animatorDurationScale =
                        Settings.Global.getFloat(getContentResolver(), Settings.Global.ANIMATOR_DURATION_SCALE, 1f);
    
        if (animatorDurationScale == 0) {
            return true;
        }
        return false;
    }
    
    
    这里特别注意:Settings.Global.ANIMATOR_DURATION_SCALE是没有默认值的,所以一定要写个默认值为1f
    
    
    
    
    
    
    Settings.Global类
    http://developer.android.com/reference/android/provider/Settings.Global.html#ANIMATOR_DURATION_SCALE
    



    疑问点:

    Launcher中有getPackageManager().isSafeMode(),注释是Return whether the device has been booted into safe mode.

    返回安全模式,和PowerManager.isPowerSaveMode()不知道是不是相同的意思。安全模式是api17引入的,PowerManager.isPowerSaveMode()和我们想要的结果更接近。


    展开全文
  •  开发者选项中提供了“窗口动画缩放”、“过渡动画缩放”、“动画程序时长缩放”三个可供调整动画时长的菜单项。单从名字上很难分辨出这三个选项作用目标是啥,我们先把系统语言调整为English,对应于“Window ...

    转载自  http://blog.csdn.net/guoqifa29/article/details/50458101

    一、简介

        开发者选项中提供了“窗口动画缩放”、“过渡动画缩放”、“动画程序时长缩放”三个可供调整动画时长的菜单项。单从名字上很难分辨出这三个选项作用目标是啥,我们先把系统语言调整为English,对应于“Window animation scale”、"Transition animation scale"、"Animator duration scale",从名字可以看出这三个选项是一个缩放因子,是动画时长duration的乘积因子(new_Duration = old_duration*scale),只是作用的目标各不相同。
        我们知道Android系统根据动画目标可划分为Window动画、Activity动画、View动画,很明显上面那三个缩放因子就对应于此。
        "Window animation scale",作用于非Activity窗口。比如,Dialog、toast、自定义浮窗、输入法等窗口都是该选项的作用目标
        "Transition animation scale",作用于Activity窗口。Activity窗口是该选项作用目标
        "Animator duration scale",作用于View。比如View属性动画、水波纹背景动画等

    二、原理
        上面了解了这三个缩放因子,下面来了解系统是何时为目标窗口的动画时长duration乘上该因子的。

        1、Setting设置动画因子。WindowManagerService提供了setAnimationScale() API供Setting使用。
              Setting代码packages/apps/Settings/src/com/android/settings/DevelopmentSettings.java
    1. private void writeAnimationScaleOption(int which, ListPreference pref, Object newValue) {  
    2.     try {  
    3.         float scale = newValue != null ? Float.parseFloat(newValue.toString()) : 1;  
    4.         mWindowManager.setAnimationScale(which, scale);  
    5.         updateAnimationScaleValue(which, pref);  
    6.     } catch (RemoteException e) {  
    7.     }  
    8. }  

        2、setAnimationScale()实现。
            setAnimationScale()函数在frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java中。
    1. @Override  
    2.    public void setAnimationScale(int which, float scale) {  
    3.        if (!checkCallingPermission(android.Manifest.permission.SET_ANIMATION_SCALE,  
    4.                "setAnimationScale()")) {  
    5.            throw new SecurityException("Requires SET_ANIMATION_SCALE permission");  
    6.        }  
    7.   
    8.        scale = fixScale(scale);  
    9.        switch (which) {  
    10.            case 0: mWindowAnimationScaleSetting = scale; break;  
    11.            case 1: mTransitionAnimationScaleSetting = scale; break;  
    12.            case 2: mAnimatorDurationScaleSetting = scale; break;  
    13.        }  
    14.   
    15.        // Persist setting  
    16.        mH.sendEmptyMessage(H.PERSIST_ANIMATION_SCALE);  
    17.    }  
        设置中三个选项设置的值最终分别保存到mWindowAnimationScaleSetting、mTransitionAnimationScaleSetting、mAnimatorDurationScaleSetting三个变量中。函数最后会post一个PERSIST_ANIMATION_SCALE消息出去,在该消息处理函数中会将三个值保存到Setting数据库中去。

        3、dump缩放因子值。

        利用“adb shell dumpsys window w -a”打印dump信息,从dump信息中可看见如下信息,这三个值对应于Setting中三个缩放因子。

        

        4、Window动画时长设置
        我们知道Window动画的设置是通过frameworks\base\services\core\java\com\android\server\wm\WindowStateAnimator.java文件的setAnimation()函数来完成的。
    1. public void setAnimation(Animation anim, long startTime) {  
    2.     ......  
    3.     mAnimation.scaleCurrentDuration(mService.getWindowAnimationScaleLocked());  
    4.     ......  
    5. }  
        很容易看出调用Animation.scaleCurrentDuration()函数来重置动画时长为duration*scale。

        5、Activity动画时长设置
        Activity切换动画的设置是通过frameworks\base\services\core\java\com\android\server\wm\AppWindowAnimator.java文件的setAnimation()函数来完成的。
    1. public void setAnimation(Animation anim, int width, int height, boolean skipFirstFrame) {  
    2.     ......  
    3.     anim.scaleCurrentDuration(mService.getTransitionAnimationScaleLocked());  
    4.     ......  
    5. }  
         很容易看出调用Animation.scaleCurrentDuration()函数来重置动画时长为duration*scale。

        6、View动画时长设置
        View动画时长是通过
    ValueAnimator.sDurationScale静态变量来控制的。
    1. public static IWindowManager getWindowManagerService() {  
    2.     synchronized (WindowManagerGlobal.class) {  
    3.         if (sWindowManagerService == null) {  
    4.             sWindowManagerService = IWindowManager.Stub.asInterface(  
    5.                     ServiceManager.getService("window"));  
    6.             try {  
    7.                 sWindowManagerService = getWindowManagerService();  
    8.                 ValueAnimator.setDurationScale(sWindowManagerService.getCurrentAnimatorScale());  
    9.             } catch (RemoteException e) {  
    10.                 Log.e(TAG, "Failed to get WindowManagerService, cannot set animator scale", e);  
    11.             }  
    12.         }  
    13.         return sWindowManagerService;  
    14.     }  
    15. }  
        上述代码表示在进程启动后第一次调用getWindowManagerService()时便会从WMS中获取缩放因子值,然后保存到ValueAnimator.sDurationScale中。
        如果Setting中更新了View动画缩放因子,那么WMS中调用dispatchNewAnimatorScaleLocked()函数后会回调上层应用的onAnimatorScaleChanged()接口,通知应用View的动画时长Scale更新了。
    1. public static IWindowSession getWindowSession() {  
    2.     synchronized (WindowManagerGlobal.class) {  
    3.         if (sWindowSession == null) {  
    4.             try {  
    5.                 InputMethodManager imm = InputMethodManager.getInstance();  
    6.                 IWindowManager windowManager = getWindowManagerService();  
    7.                 sWindowSession = windowManager.openSession(  
    8.                         new IWindowSessionCallback.Stub() {  
    9.                             @Override  
    10.                             public void onAnimatorScaleChanged(float scale) {  
    11.                                 ValueAnimator.setDurationScale(scale);  
    12.                             }  
    13.                         },  
    14.                         imm.getClient(), imm.getInputContext());  
    15.             } catch (RemoteException e) {  
    16.                 Log.e(TAG, "Failed to open window session", e);  
    17.             }  
    18.         }  
    19.         return sWindowSession;  
    20.     }  
    21. }  
        对于View动画,如果动画时长使用了ValueAnimator.sDurationScale,那么必然受"Animator duration scale"控制。

    三、总结

    Setting中三个选项是一个动画时长的乘积因子,作用目标分别是Window、Activity、View。对于View来说,如果动画未使用ValueAnimator.sDurationScale做一个乘积计算,那么动画时长自然不受Setting的影响。
    展开全文
  • 骨骼动画程序

    千次阅读 2015-01-27 11:56:52
    目的在于给程序员介绍骨骼动画的原理、数据结构和程序实现的粗略方法。 骨骼动画的应用面很多,主要用在3D角色动画,不过现在也很多人用于2D动画。下面的内容不会直接的把程序列出,只会阐述原理,关键的步骤是使用...

    最近有人问我怎样实现骨骼动画,于是我就想起了我以前写的这篇文章,贴上来给大家看看。
    一、文章编写目的
    写这篇文章,是给程序员看的。目的在于给程序员介绍骨骼动画的原理、数据结构和程序实现的粗略方法。
    骨骼动画的应用面很多,主要用在3D角色动画,不过现在也很多人用于2D动画。下面的内容不会直接的把程序列出,只会阐述原理,关键的步骤是使用矩阵做坐标系变换。原理明白之后,不管2D或者3D应该都能自己编写。
    二、什么是骨骼动画
    传统的动画,一般是对一个物体对象进行位移、旋转、缩放、变形,然后把关键帧的信息记录下来,在播放的时候按照关键帧时间对物体对象进行位移、旋转、缩放、变形,并在关键帧与关键帧之间做插值运算。
    骨骼动画的特点是,需要做动画的物体对象本身不记录位移、旋转、缩放、变形信息,而是通过了第三方的“骨骼”物体记录动画信息,然后物体对象本身只记录受到骨骼物体影响的权重。在播放的时候,通过骨骼物体的关键帧和物体对象记录的权重,让动画重现。

    更多内容,请访问技术社区

    三、骨骼动画的好处
    相对于传统动画,骨骼动画似乎多了2个记录:骨骼物体和权重。按道理来说,这种骨骼动画的资源容量和运行效率应该不如传统的动画,那为什么还要做骨骼动画呢?
    好处有以下几点:
    1、骨骼动画是影响到顶点级别的动画,而且可以多根骨骼根据权重影响同一个顶点,不论是2D或者3D使用,都可以让动画做得更丰富。
    2、做到了对象和动画分离,我们只需要记录了物体对于骨骼的蒙皮权重,就可以单独的去制作骨骼的动画,在保证蒙皮信息和骨骼信息一致的情况下,还可以多个物体之间共享动画。
    3、相对于2D的逐帧动画大大的节省资源容量。
    4、3D角色动画离不开骨骼动画。

    四、美术层面理解骨骼动画
    由于骨骼动画一般是由美术人员,更准确的是由动画师来制作的,所以相对于程序员来说,美术人员接触的机会比较多。这篇文章是给程序员看的,不过在从数据级别操作骨骼动画之前,最好还是先了解一下美术层面制作骨骼动画的方法。至于2D还是3D的情况下做骨骼动画,其实原理是一样的,只是2D时少了几个点,然后一个轴固定值了而已。
    这里以3DsMax来举例子。需要制作一个骨骼动画,需要这几样东西:
    1、网格物体
    2、骨骼物体
    3、蒙皮修改器
    4、关键帧
    网格物体:
    需要做动画的对象物体,如这个例子里面我们需要让这个长方体翘起来

    骨骼物体:
    严格的骨骼对象物体,3DsMax有2种,一种是Bone,一种是biped。其实所有的物体都可以作为骨骼,包括了多面体网格物体、辅助物体等,都可以作为骨骼使用。不过为了便于一般操作习惯和导出数据方便,我们都只用Bone和Biped这两种。

    蒙皮修改器:
    3DsMax有2种蒙皮修改器,Skin和Physique。作用都一样,都是给网格物体的顶点赋予权重。也没有谁好谁坏之说,看个人使用习惯。不过由于大部分的模型导出插件都不支持Physique蒙皮修改器,所以一般来说,都是使用Skin。
    蒙皮修改器可以使用范围框、笔刷或者逐个点来调节权重,不过本质都是一样的,最后得到的是几根骨骼相对于某个顶点的影响权重。



    上图中的顶点受到骨骼bone01的0.25的影响,受到bone02的0.75的影响。这种情况下,该顶点虽然同时受到2根骨骼的影响,但bone02对它的影响会比较多一点。

    正常的情况下,一个顶点受到多根骨骼影响的权重加起来应该等于1。

    关键帧:
    关键帧信息包括了
    l 时间
    l 位移旋转缩放的值
    l 过渡插值的方式



    注意的是,软件操作上打了关键帧的物体才会动,不打关键帧的物体不会动或者跟随着父级物体动。所以很多动画师对一些由于不需要动的物体不打关键帧的。但由于每种动画导出插件的处理不一样,有些插件的编写作者也是忽略了这种情况,而导致了在动画解析的过程中缺少了部分的数据,导致动画播放不正常。
    五、程序层面理解骨骼动画
    相对于美术层面,程序方面需要以下的几个数据:
    1、顶点索引数据
    相对于美术只用关系网格物体的原始的位移旋转缩放,程序关心的是网格物体的每一个顶点的位置坐标,还有顶点之间组成网格的索引顺序。所谓的原始,指的是物体在没有进行蒙皮之前的位置。
    如果是做2D,那么数据就会变成每个面片的四个顶点的坐标,而索引就要自己用算法去生成。当然索引只是在3d渲染时才用到,如果是纯2d,你可能只关心四个顶点的位置,然后绘制出面片。
    由于之后一直都需要针对每一个顶点去储存和提取数据,所以在一开始的时候,就要把这些顶点的顺序固定下来。

    2、骨骼物体数据
    骨骼物体我们不会关心他是什么类型,体积有多大,或者由多少个顶点组成。我们只关心它的位移旋转缩放的原始坐标,还有父子链接的关系。这个原始坐标需要和网格物体的原始状态保持一致,即没有蒙皮和做动画之前,骨骼的位置。由于骨骼通常是很多根的,所以在记录的开始,也必须先给骨骼都排序。
    对于2D来说,骨骼有可能并没有实质性的形象,你可以用一个矩形或者一个线条做代表,最后需要导出的只是该对象的坐标,还有父子链接的关系。

    父子链接关系:图中有2根骨骼。其中父物体发生位移旋转,子物体会跟随父物体做位移旋转。但子物体做位移旋转的时候,父物体是不会受到影响的。
    这里会涉及到2个坐标系的概念,一个是世界坐标,一个是局部坐标。
    如果一个物体没有父物体,也就是说它的父物体就是“世界”,那么它的当前坐标就是世界坐标;
    如果一个物体有父物体,那么它除了有世界坐标以外,还有一个相对于父物体的相对坐标。
    例如:
    父物体的世界坐标是(1,0,0),子物体的世界坐标是(0,1,0),那么子物体相对于父物体的局部坐标就是(-1,1,0)
    3、每一个点的蒙皮权重
    之前我们记录顶点信息和骨骼信息时,都是已经排好序的,所以我们在记录蒙皮权重的时候,就可以只是记录各自的序号,还有对应的权重。一个顶点原则上是可以受到无限多根骨骼的影响,不过在实际的应用中,为了不让计算过于复杂,一般一个顶点最多只会受到4根骨骼的影响。
    4、关键帧数据
    根据记录骨骼坐标的坐标系不同,可以选择记录每一根骨骼的绝对坐标,也可以记录有动画的骨骼的相对坐标。
    根据是否计算插值,可以选择记录每一帧的信息,也可以选择只记录关键帧的信息,还有关键帧的插值方式。
    之前我们介绍了绝对坐标和相对坐标,如果是记录世界坐标,那是最准确的,但由于每一根骨骼的每一帧都需要去记录,不管它是否做过动画,这样动画的数据量会比较大。如果记录的是相对坐标,那么如果在子物体没有做动画的情况下,它就不需要记录,而是通过父物体的坐标来计算出子物体的世界坐标。这样做可以让导出的数据容量很小。不过这会增加解析时候的运算量。使用哪一种方式记录关键帧,需要根据自己的项目实际情况来决定。
    五、骨骼动画的计算原理
    1、4*4矩阵的概念
    对于骨骼关键帧的记录,我们需要记录位移(xyz)、旋转(通常用四元数xyzw)、缩放(xyz)这么多个数据。我们计算的时候也可以逐个点去分别计算他们的位移旋转缩放来做动画。不过骨骼动画一般会涉及到坐标系的转换,所以我们通常会都用矩阵来做运算。
    一般的矩阵运算都是3*3矩阵,但在做3D方面的运算时,通常会把矩阵扩展为4*4矩阵。具体的做法请参考矩阵的基础知识。大概过程是,先通过旋转和缩放算出3*3矩阵,然后再增多一个维度填上位移坐标。
    根据矩阵左乘和右乘的不同,你的矩阵可能不一样,下面的公式是以左乘为基础的。

    不同的引擎不同的作者,可能使用不同的矩阵相乘规则,由于矩阵相乘是不满足交换律的,也就是AB!=BA,所以一开始必须先搞清楚当前的引擎矩阵究竟是左乘还是右乘的,还有坐标系是用左手坐标系,还是右手坐标系。形式转换经常是错误的根源。
    经过位移旋转缩放的计算,或者直接从3D软件里面就导出矩阵,我们得到的4*4矩阵应该是这样的
    左乘:
    r11 r12 r13 0
    r21 r22 r23 0
    r31 r32 r33 0
    tx ty tz 1
    右乘:
    r11 r21 r31 tx
    r12 r22 r32 ty
    r13 r23 r33 tz
    0 0 0 1
    其中r3*3是旋转缩放计算的矩阵,tx、ty、tz是位移
    2、坐标系转换概念
    之前说过,骨骼有世界坐标和局部坐标的分部。其实所有东西都有绝对坐标和相对坐标的概念。
    拿顶点和骨骼来说,顶点本身有世界坐标,也有相对于骨骼的相对坐标。
    关于绝对坐标系和相对坐标系的转换,请参考3D图形数学里面的坐标系转换。我只说简单的原理。
    假设有:物体A和物体B,A的世界坐标是Va世界,B的世界坐标是Vb世界
    现在我们需要把A的坐标转换成相对于B的相对坐标,记作Vab。
    那么我们需要构造一个矩阵M世界-b,
    Vab = Va世界*M世界-b。
    其中M世界-b是根据Vb世界求出来的,一般是Vb世界的逆矩阵。
    反过来,如果制定了A在B的相对坐标,也知道了B的实际坐标,我们需要求回A的世界坐标。那么应该是
    Va世界= Vab*Mb-世界。
    其中Mb-世界矩阵就是M世界-b的逆矩阵。乘以逆矩阵的几何含义,就是把之前做过的变换取消掉。
    一定要先把这个矩阵转换坐标系的概念搞清楚,这其实就是整个骨骼动画的原理关键。其中的A就是物体的顶点,B就是骨骼。
    3、骨骼动画原理
    前面废话了这么多,终于到核心部分了。
    我们先从最简单的情况考虑。
    假设我们的模型只有一个顶点,骨骼也只有一根,这个顶点完全受这根骨骼的影响。

    红色点是顶点,蓝色的线是骨骼,这里把骨骼画成线只是为了便于叙述,其实骨骼是没有长度概念的。

    我们旋转了骨骼,由于顶点完全受骨骼影响,所以顶点的坐标也发生了变化。
    那么我们怎样求出顶点在动画之后的坐标呢?
    通过观察,顶点在动画前和后后,虽然实际坐标发生了变化,但是相对于骨骼的相对坐标是没有发生变化的。只要知道了相对坐标,再通过动画后骨骼的坐标,就能通过转换坐标系,得到动画后顶点的世界坐标了。
    那么,我们可以这么做:
    设:
    顶点的动画前世界坐标为:V世界0
    顶点在动画后世界坐标为:V世界1
    骨骼的动画前世界坐标为:B世界0
    骨骼在动画后世界坐标为:B世界1
    然后通过B世界0可以计算出从世界坐标转换到骨骼相对坐标的:M0世界-b
    通过B世界1可以计算出从骨骼相对坐标转换到世界坐标的:M1b-世界
    然后,我们要求出V世界1
    首先求出顶点相对于骨骼的相对坐标Vb:
    Vb = V世界0*M世界-b
    然后当运动之后,我们就可以求得
    V世界1=Vb*M1b-世界
    那么整个过程就是
    V世界1 = V世界0*M世界-b*M1b-世界
    看似过程有点复杂,其实Vb是固定的,我们甚至可以在导出数据的时候就先算好了。到了真正需要做动画的时候,我们只需要再知道一个B世界1,就足够我们算出当前的顶点应该在的位置了。

    我们再加大复杂程度:
    假设顶点还是一个,但骨骼变成了2根,顶点受a骨骼0.75权重的影响,受b骨骼0.25的影响

    我们需要做的和前面一样,虽然骨骼变成两根了,但我们可以先忽略了权重,分别求出V世界1a和V世界1b。
    之后的事情就很简单了:
    V世界1 = V世界1a*0.75+V世界1b*0.25。
    如此类推,把权重标记成W,就变成了
    V世界1 = V世界1a*Wa+V世界1b*Wb+V世界1c*Wc+V世界1c*Wc……

    4、骨骼动画的整个工作流程:

    1.导出原始数据,包括顶点原始位置、骨骼原始位置、蒙皮权重和骨骼关键帧。
    2.解析数据,为每一个顶点记录下相对于影响它的骨骼的相对坐标,和该骨骼对它的影响。然后把骨骼关键帧解析成每一帧的4*4矩阵,并按照时间储存起来。
    3.骨骼动画开始播放,先获得该时间点的所有的骨骼的矩阵,用缓存器存起来已备接下来所有的点都能访问。然后每个顶点根据第2步解析的影响它的骨骼的编号获取相应骨骼的坐标,配合权重计算出该顶点真实的世界坐标。
    4.把所有顶点按照第3步都计算完毕,然后渲染出来,整个角色的动画就出现了。




    展开全文
  •  开发者选项中提供了“窗口动画缩放”、“过渡动画缩放”、“动画程序时长缩放”三个可供调整动画时长的菜单项。单从名字上很难分辨出这三个选项作用目标是啥,我们先把系统语言调整为English,对应于“Window ...

    https://blog.csdn.net/guoqifa29/article/details/50458101

     

    一、简介
        开发者选项中提供了“窗口动画缩放”、“过渡动画缩放”、“动画程序时长缩放”三个可供调整动画时长的菜单项。单从名字上很难分辨出这三个选项作用目标是啥,我们先把系统语言调整为English,对应于“Window animation scale”、"Transition animation scale"、"Animator duration scale",从名字可以看出这三个选项是一个缩放因子,是动画时长duration的乘积因子(new_Duration = old_duration*scale),只是作用的目标各不相同。
        我们知道Android系统根据动画目标可划分为Window动画、Activity动画、View动画,很明显上面那三个缩放因子就对应于此。
        "Window animation scale",作用于非Activity窗口。比如,Dialog、toast、自定义浮窗、输入法等窗口都是该选项的作用目标
        "Transition animation scale",作用于Activity窗口。Activity窗口是该选项作用目标
        "Animator duration scale",作用于View。比如View属性动画、水波纹背景动画等

    二、原理
        上面了解了这三个缩放因子,下面来了解系统是何时为目标窗口的动画时长duration乘上该因子的。

        1、Setting设置动画因子。WindowManagerService提供了setAnimationScale() API供Setting使用。
              Setting代码在packages/apps/Settings/src/com/android/settings/DevelopmentSettings.java

            private void writeAnimationScaleOption(int which, ListPreference pref, Object newValue) {
                try {
                    float scale = newValue != null ? Float.parseFloat(newValue.toString()) : 1;
                    mWindowManager.setAnimationScale(which, scale);
                    updateAnimationScaleValue(which, pref);
                } catch (RemoteException e) {
                }
            }


        2、setAnimationScale()实现。
            setAnimationScale()函数在frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java中。

         @Override
            public void setAnimationScale(int which, float scale) {
                if (!checkCallingPermission(android.Manifest.permission.SET_ANIMATION_SCALE,
                        "setAnimationScale()")) {
                    throw new SecurityException("Requires SET_ANIMATION_SCALE permission");
                }
         
                scale = fixScale(scale);
                switch (which) {
                    case 0: mWindowAnimationScaleSetting = scale; break;
                    case 1: mTransitionAnimationScaleSetting = scale; break;
                    case 2: mAnimatorDurationScaleSetting = scale; break;
                }
         
                // Persist setting
                mH.sendEmptyMessage(H.PERSIST_ANIMATION_SCALE);
            }

        设置中三个选项设置的值最终分别保存到mWindowAnimationScaleSetting、mTransitionAnimationScaleSetting、mAnimatorDurationScaleSetting三个变量中。函数最后会post一个PERSIST_ANIMATION_SCALE消息出去,在该消息处理函数中会将三个值保存到Setting数据库中去。

        3、dump缩放因子值。

        利用“adb shell dumpsys window w -a”打印dump信息,从dump信息中可看见如下信息,这三个值对应于Setting中三个缩放因子。
        

        4、Window动画时长设置
        我们知道Window动画的设置是通过frameworks\base\services\core\java\com\android\server\wm\WindowStateAnimator.java文件的setAnimation()函数来完成的。

            public void setAnimation(Animation anim, long startTime) {
                ......
                mAnimation.scaleCurrentDuration(mService.getWindowAnimationScaleLocked());
                ......
            }

        很容易看出调用Animation.scaleCurrentDuration()函数来重置动画时长为duration*scale。

        5、Activity动画时长设置
        Activity切换动画的设置是通过frameworks\base\services\core\java\com\android\server\wm\AppWindowAnimator.java文件的setAnimation()函数来完成的。

            public void setAnimation(Animation anim, int width, int height, boolean skipFirstFrame) {
                ......
                anim.scaleCurrentDuration(mService.getTransitionAnimationScaleLocked());
                ......
            }

         很容易看出调用Animation.scaleCurrentDuration()函数来重置动画时长为duration*scale。

        6、View动画时长设置
        View动画时长是通过ValueAnimator.sDurationScale静态变量来控制的。

            public static IWindowManager getWindowManagerService() {
                synchronized (WindowManagerGlobal.class) {
                    if (sWindowManagerService == null) {
                        sWindowManagerService = IWindowManager.Stub.asInterface(
                                ServiceManager.getService("window"));
                        try {
                            sWindowManagerService = getWindowManagerService();
                            ValueAnimator.setDurationScale(sWindowManagerService.getCurrentAnimatorScale());
                        } catch (RemoteException e) {
                            Log.e(TAG, "Failed to get WindowManagerService, cannot set animator scale", e);
                        }
                    }
                    return sWindowManagerService;
                }
            }

        上述代码表示在进程启动后第一次调用getWindowManagerService()时便会从WMS中获取缩放因子值,然后保存到ValueAnimator.sDurationScale中。
        如果Setting中更新了View动画缩放因子,那么WMS中调用dispatchNewAnimatorScaleLocked()函数后会回调上层应用的onAnimatorScaleChanged()接口,通知应用View的动画时长Scale更新了。

            public static IWindowSession getWindowSession() {
                synchronized (WindowManagerGlobal.class) {
                    if (sWindowSession == null) {
                        try {
                            InputMethodManager imm = InputMethodManager.getInstance();
                            IWindowManager windowManager = getWindowManagerService();
                            sWindowSession = windowManager.openSession(
                                    new IWindowSessionCallback.Stub() {
                                        @Override
                                        public void onAnimatorScaleChanged(float scale) {
                                            ValueAnimator.setDurationScale(scale);
                                        }
                                    },
                                    imm.getClient(), imm.getInputContext());
                        } catch (RemoteException e) {
                            Log.e(TAG, "Failed to open window session", e);
                        }
                    }
                    return sWindowSession;
                }
            }

        对于View动画,如果动画时长使用了ValueAnimator.sDurationScale,那么必然受"Animator duration scale"控制。

    三、总结

    Setting中三个选项是一个动画时长的乘积因子,作用目标分别是Window、Activity、View。对于View来说,如果动画未使用ValueAnimator.sDurationScale做一个乘积计算,那么动画时长自然不受Setting的影响
     

    展开全文
  • 骨骼动画程序原理介绍

    万次阅读 2018-08-13 23:17:40
    目的在于给程序员介绍骨骼动画的原理、数据结构和程序实现的粗略方法。 骨骼动画的应用面很多,主要用在3D角色动画,不过现在也很多人用于2D动画。下面的内容不会直接的把程序列出,只会阐述原理,关键的步骤是使用...
  • Android 启动程序时动画效果

    万次阅读 多人点赞 2013-10-22 10:10:37
    1、当你打开一个应用程序时,总会看到前面有一个加载动画页面,下面我们就看看怎么来实现  2、新建一个.xml 文件,添加一个ImageView 组件,该组件用来加载图片 xmlns:tools="http://schemas.andr
  • Qt实现程序启动动画

    千次阅读 2019-07-15 10:28:10
    演示一个应用程序启动,添加启动动画的小例子。 所谓启动动画,就是说当一个应用程序启动,在展示主窗口之前,有可能会先去初始化一些运行环境,验证用户信息等前提工作。那么在这段空闲期程序的启动过程是没有...
  • 动画脚本 Animation Scripting Unity's 动画系统允许你创建一个漂亮的...动画层,控制动画回放的所有方面(时间,速度,混合权重) 每个顶点有1.2.4个骨骼影响的mesh,基于物理系统的布娃娃系统,另外还有程序动画
  • 微信小程序 动画

    千次阅读 2017-06-15 12:08:51
    微信小程序 动画 一.先看一个例子及代码: 发射 .sure{ width: 10%; height:80rpx; margin-top: 0rpx; margin-left: 45%; background: #00ddff; border-radius: 50rpx; text-align: center; line-...
  • 程序抛物线动画

    千次阅读 2018-05-23 07:18:16
    由于最近小程序项目需要用到加入购物车的动画,自己结合小程序官方文档写了一下加入购物车动画demo, 有需要改进的地方还请指出; 先来看一下demo的效果图: 分析 要实现抛物线动画,我当时想到的是用插件的方式,...
  • 微信小程序动画详解

    千次阅读 2018-07-03 15:48:28
    动画水还是比较深的,这里只是简单介绍下小程序动画的一些属性和注意事项,做动画前一定要整理好思路将动画一步步分解,再进行组合!这里只做引入。wx.createAnimation(object)看官方介绍1.创建一个动画实例...
  • 微信小程序 -数字滚动动画

    千次阅读 2020-10-19 10:39:56
    使用transtion动画,top发生变化就会滚动,然后通过指定动画的delay、duration,使数字之间延时动画 项目代码 js文件 // components/scroll-number/index.js Component({ externalClasses: ['container-class', ...
  • 微信小程序动画效果集合

    万次阅读 2018-06-11 21:10:34
    动画卡片效果 : http://www.wxapp-union.com/forum.php?mod=viewthread&tid=2193   列表项左滑删除效果 : http://www.wxapp-union.com/forum.php?mod=viewthread&tid=2189 (更多左滑删除效果请直接在论坛内搜索...
  • 程序-动画,距离移动端适配方法

    千次阅读 2018-04-09 17:30:31
    程序动画,距离移动端适配方法 问题: 由于小程序动画如下: that.animation.translateY(-640 ).step() 距离没有单位,据实测是手机的分辨率,物理像素乘以dpr,导致在不同手机上移动距离不相同 解:...
  • 微信小程序动画之消息框弹出

    万次阅读 2019-05-30 13:17:13
    微信小程序动画之消息框弹出 上图 js: Page({ data: { showModalStatus: false }, powerDrawer: function(e) { var currentStatu = e.currentTarget.dataset.statu; this.util(currentStatu) }, util: ...
  • 程序中的Animation动画

    千次阅读 2019-06-10 14:12:04
    程序动画三步走 在需要动画效果的元素上给animation属性绑定一个变量,假设是textLeftAnimation 在需要的时机调用api创建动画对象并描述动画效果 利用this.setData() 将动画对象.export() 方法赋值到...
  • //动画持续时长两秒 position = parseFloat(position.toFixed(2)) //16ms移动的距离 let time_distance = parseFloat((s * 16 / time).toFixed(2)) s = parseFloat(s.toFixed(2)) if (s === 0) { return ...
  • 微信小程序 导航栏加载动画

    千次阅读 2020-02-19 16:47:19
    顶部加载数据,转圈的动画 //开始动画 wx.showNavigationBarLoading() //停止动画 wx.hideNavigationBarLoading(); 在接收网络请求的时候开始动画,当数据设置完成后停止动画 代码示例: // pages/movie/movie-...
  • 微信小程序 使用animate动画教程

    千次阅读 2020-08-11 09:40:34
    1.下载文件。 ...2.在项目根目录新建一个“style”文件夹存放下载样式文件。 3.全局导入样式,在“app.wxss”文件...animation: 动画名 持续时长 速度曲线 开始时延迟的时长 播放次数 轮流反向播放 第一种: 直接给全
  • 最近小程序中有一个图片旋转的需求,最初是想着通过切换多张图片达到旋转的效果,后来发现微信小程序带有动画api,然后就改由image+Animation来实现。 ###首先在wxml中定义image <image class="bth_...
  • 程序实现老虎机抽奖动画

    千次阅读 2019-04-01 12:35:52
    // 随即生成摇奖区滚动的总共时长,范围5000-6000 let randomTotalTime = Math.random() * 1000 + 5000; randomTotalTime = parseInt(randomTotalTime, 10); // 随即生成每次循环间隔的时间,500-600之间的...
  • 程序开发API之动画Animation

    千次阅读 2019-01-23 14:30:37
    效果展示 ...最后通过动画实例的 export 方法导出动画数据传递给组件的 animation 属性。 wx.createAnimation参数 timingFunction 的合法值### transform-origin 属性允许您改变被转换元素的位置。 tra...
  • 在微信小程序中使用animate.css动画效果 一.在自已的app.wxss文件中引入animate.css: @import /style/animate.wxss 从https://github.com/daneden/animate.css下载animate.css文件之后,有两件事可做: 第1,...
  • 前景:在做位移等动画效果,所要求填写的距离参数没有单位,据实测是手机的分辨率,物理像素乘以dpr。导致在不同手机上移动距离不相同,适配很不好 解决:使用小程序的获取系统信息方法my.getSystemInfo获取...
  • 程序左侧抽屉动画(侧栏菜单)

    千次阅读 2019-01-02 16:02:36
    由于不能是用JS来获取DOM,所以以往使用Jquery编写的动画,在小程序里面都不能使用; ** ** 忘了从哪里看到的文章,这里我用自己的方式给他整理出来~知识都在于分享。 首先微信下程序的每一个页面基本的格式是由四个...
  • 微信小程序登录页动画-云层漂浮

    千次阅读 2017-05-08 00:30:25
    前言2017年前端火了,微信小程序、weex、reactnative,就连支付宝也搞起了小程序,总感觉这是原生要毁灭的节奏啊,我也乘热上车万一波。上效果图(GI动态图) 当我看到这张背景图的时候,强迫症立马来了,这云朵为...
  • 目前市面上小程序越来越多,微信,支付宝,头条都推出了自己的小程序,但是由于微信小程序是最开始的,小程序刚出的时候我也了解过,当时写了个demo也写了一个小的新闻客户端,当时觉得小程序还是有点弱,所以后来就...
  • 本文将详细介绍 Android 动画中 属性动画的原理 & 使用 相关文章阅读: 1. Android 动画系列 Android 动画:手把手教你使用 补间动画 Android 动画:你真的会使用插值器与估值器吗?(含详细实例教学) 2. ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 78,519
精华内容 31,407
关键字:

动画程序时长是什么