Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b989502e authored by Chet Haase's avatar Chet Haase
Browse files

Adding small animation features

RectEvaluator is useful when animating object bounds.
The other change is a hidden API that allows temporary suspension
of layout, useful for animations which need to animate view bounds
without conflicting with layout passes that might happen in the middle
of the animation.

Change-Id: I3dc08cb6ec455dfa3409e825506b218d3ea63d7a
parent eaadd123
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -2477,6 +2477,11 @@ package android.animation {
    method public void setPropertyName(java.lang.String);
  }
  public class RectEvaluator implements android.animation.TypeEvaluator {
    ctor public RectEvaluator();
    method public android.graphics.Rect evaluate(float, android.graphics.Rect, android.graphics.Rect);
  }
  public class TimeAnimator extends android.animation.ValueAnimator {
    ctor public TimeAnimator();
    method public void setTimeListener(android.animation.TimeAnimator.TimeListener);
+45 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2013 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package android.animation;

import android.graphics.Rect;

/**
 * This evaluator can be used to perform type interpolation between <code>int</code> values.
 */
public class RectEvaluator implements TypeEvaluator<Rect> {

    /**
     * This function returns the result of linearly interpolating the start and
     * end Rect values, with <code>fraction</code> representing the proportion
     * between the start and end values. The calculation is a simple parametric
     * calculation on each of the separate components in the Rect objects
     * (left, top, right, and bottom).
     *
     * @param fraction   The fraction from the starting to the ending values
     * @param startValue The start Rect
     * @param endValue   The end Rect
     * @return A linear interpolation between the start and end values, given the
     *         <code>fraction</code> parameter.
     */
    @Override
    public Rect evaluate(float fraction, Rect startValue, Rect endValue) {
        return new Rect(startValue.left + (int)((endValue.left - startValue.left) * fraction),
                startValue.top + (int)((endValue.top - startValue.top) * fraction),
                startValue.right + (int)((endValue.right - startValue.right) * fraction),
                startValue.bottom + (int)((endValue.bottom - startValue.bottom) * fraction));
    }
}
+30 −6
Original line number Diff line number Diff line
@@ -406,10 +406,16 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
    private View[] mChildren;
    // Number of valid children in the mChildren array, the rest should be null or not
    // considered as children
    private int mChildrenCount;

    private boolean mLayoutSuppressed = false;
    // Whether layout calls are currently being suppressed, controlled by calls to
    // suppressLayout()
    boolean mSuppressLayout = false;

    private int mChildrenCount;
    // Whether any layout calls have actually been suppressed while mSuppressLayout
    // has been true. This tracks whether we need to issue a requestLayout() when
    // layout is later re-enabled.
    private boolean mLayoutCalledWhileSuppressed = false;

    private static final int ARRAY_INITIAL_CAPACITY = 12;
    private static final int ARRAY_CAPACITY_INCREMENT = 12;
@@ -2564,7 +2570,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
        exitHoverTargets();

        // In case view is detached while transition is running
        mLayoutSuppressed = false;
        mLayoutCalledWhileSuppressed = false;

        // Tear down our drag tracking
        mDragNotifiedChildren = null;
@@ -4525,7 +4531,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
            super.layout(l, t, r, b);
        } else {
            // record the fact that we noop'd it; request layout when transition finishes
            mLayoutSuppressed = true;
            mLayoutCalledWhileSuppressed = true;
        }
    }

@@ -5201,9 +5207,9 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
        @Override
        public void endTransition(LayoutTransition transition, ViewGroup container,
                View view, int transitionType) {
            if (mLayoutSuppressed && !transition.isChangingLayout()) {
            if (mLayoutCalledWhileSuppressed && !transition.isChangingLayout()) {
                requestLayout();
                mLayoutSuppressed = false;
                mLayoutCalledWhileSuppressed = false;
            }
            if (transitionType == LayoutTransition.DISAPPEARING && mTransitioningViews != null) {
                endViewTransition(view);
@@ -5211,6 +5217,24 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
        }
    };

    /**
     * Tells this ViewGroup to suppress all layout() calls until layout
     * suppression is disabled with a later call to suppressLayout(false).
     * When layout suppression is disabled, a requestLayout() call is sent
     * if layout() was attempted while layout was being suppressed.
     *
     * @hide
     */
    public void suppressLayout(boolean suppress) {
        mSuppressLayout = suppress;
        if (!suppress) {
            if (mLayoutCalledWhileSuppressed) {
                requestLayout();
                mLayoutCalledWhileSuppressed = false;
            }
        }
    }

    /**
     * {@inheritDoc}
     */