首页 > 代码库 > AppTransition笔记

AppTransition笔记

<p></p><pre name="code" class="java"><span style="font-size:18px;"><span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">AppTransition是一个Activity过渡动</span>画控制类,“ State management of app transitions. ”。提供了创建缩小、放大动画接口,加载动画等接口。</span>
<span style="font-size:18px;">1、mConfigShortAnimTime</span>

过渡动画持续时长。这个值只有在创建缩小(createThumbnailAnimationLocked ()、放大(createScaleUpAnimationLocked())动画时才有效。这个值会设置到Animation.mDuration中去,mDuration值还可以被scaleCurrentDuration()函数放大多少倍。

<span style="font-size:18px;">    public void scaleCurrentDuration(float scale) {
        mDuration = (long) (mDuration * scale);
        mStartOffset = (long) (mStartOffset * scale);
    }</span>

2、mDecelerateInterpolator

是一个Interpolator类对象,从名字看是一个减速插值器。Interpolator(插值器)用来修饰动画效果,定义动画的变化率,可以使存在的动画效果accelerated(加速),decelerated(减速),repeated(重复),bounced(弹跳)等,详情请看此博文。这个插值器在createThumbnailAnimationLocked ()createScaleUpAnimationLocked()中设置到窗口缩放Animation中去。

<span style="font-size:18px;"> * An interpolator defines the rate of change of an animation. This allows
 * the basic animation effects (alpha, scale, translate, rotate) to be 
 * accelerated, decelerated, repeated, etc.</span>

3、mThumbnailFadeoutInterpolator

是一个淡出插值器,不过这个插值器会设置到透明度Animation中去。

        mThumbnailFadeoutInterpolator = new Interpolator() {
            @Override
            public float getInterpolation(float input) {
                // Linear response for first fraction, then complete after that.
                if (input < RECENTS_THUMBNAIL_FADEOUT_FRACTION) {
                    return input / RECENTS_THUMBNAIL_FADEOUT_FRACTION;
                }
                return 1.0f;
            }
        };
由代码可以看出,在动画播放到0.25时间占比之前,会

4、mDuration、Interpolator(插值器)是如何影响动画效果的呢?

这个需要研究Animation.getTransformation(),在前面的博客中说了getTransformation()是Animation中最重要的函数,这个函数会返回一个Transformation,里面包含一个3*3矩阵、alpha通道值,这些值会直接设置到SurfaceFlinger中去。

<span style="font-size:18px;"> public boolean getTransformation(long currentTime, Transformation outTransformation) {
        ..........
        if (duration != 0) {
            normalizedTime = ((float) (currentTime - (mStartTime + startOffset))) /
                    (float) duration;
        }
        ...........
        final float interpolatedTime = mInterpolator.getInterpolation(normalizedTime);
            applyTransformation(interpolatedTime, outTransformation);
        ...........
}</span>
这个函数的逻辑非常简单,首先求出当前播放时长跟总时长比值,然后将这个小于1的比值作为参数传给插值器,进而返回一个按一定变化规律更改过的值,最后将返回的值(插值器返回的时间比值)传给applyTransformation()来求出对应的Transformation。从上述看来,动画效果受三个方面影响:①mDuration;②插值器;③applyTransformation()函数。不过这三个因素对动画的影响效果是截然不同的,mDuration影响的是动画总时长,插值器影响的是动画变化率,applyTransformation()影响的是播动画时窗口大小和透明度。

3、createScaleUpAnimationLocked()

4、createThumbnailAnimationLocked()






AppTransition笔记