FileDocCategorySizeDatePackage
Explode.javaAPI DocAndroid 5.1 API6846Thu Mar 12 22:22:10 GMT 2015android.transition

Explode

public class Explode extends Visibility
This transition tracks changes to the visibility of target views in the start and end scenes and moves views in or out from the edges of the scene. Visibility is determined by both the {@link View#setVisibility(int)} state of the view as well as whether it is parented in the current view hierarchy. Disappearing Views are limited as described in {@link Visibility#onDisappear(android.view.ViewGroup, TransitionValues, int, TransitionValues, int)}.

Views move away from the focal View or the center of the Scene if no epicenter was provided.

Fields Summary
private static final android.animation.TimeInterpolator
sDecelerate
private static final android.animation.TimeInterpolator
sAccelerate
private static final String
TAG
private static final String
PROPNAME_SCREEN_BOUNDS
private int[]
mTempLoc
Constructors Summary
public Explode()


      
        setPropagation(new CircularPropagation());
    
public Explode(android.content.Context context, android.util.AttributeSet attrs)

        super(context, attrs);
        setPropagation(new CircularPropagation());
    
Methods Summary
private static floatcalculateDistance(float x, float y)

        return FloatMath.sqrt((x * x) + (y * y));
    
private static floatcalculateMaxDistance(android.view.View sceneRoot, int focalX, int focalY)

        int maxX = Math.max(focalX, sceneRoot.getWidth() - focalX);
        int maxY = Math.max(focalY, sceneRoot.getHeight() - focalY);
        return calculateDistance(maxX, maxY);
    
private voidcalculateOut(android.view.View sceneRoot, android.graphics.Rect bounds, int[] outVector)

        sceneRoot.getLocationOnScreen(mTempLoc);
        int sceneRootX = mTempLoc[0];
        int sceneRootY = mTempLoc[1];
        int focalX;
        int focalY;

        Rect epicenter = getEpicenter();
        if (epicenter == null) {
            focalX = sceneRootX + (sceneRoot.getWidth() / 2)
                    + Math.round(sceneRoot.getTranslationX());
            focalY = sceneRootY + (sceneRoot.getHeight() / 2)
                    + Math.round(sceneRoot.getTranslationY());
        } else {
            focalX = epicenter.centerX();
            focalY = epicenter.centerY();
        }

        int centerX = bounds.centerX();
        int centerY = bounds.centerY();
        float xVector = centerX - focalX;
        float yVector = centerY - focalY;

        if (xVector == 0 && yVector == 0) {
            // Random direction when View is centered on focal View.
            xVector = (float) (Math.random() * 2) - 1;
            yVector = (float) (Math.random() * 2) - 1;
        }
        float vectorSize = calculateDistance(xVector, yVector);
        xVector /= vectorSize;
        yVector /= vectorSize;

        float maxDistance =
                calculateMaxDistance(sceneRoot, focalX - sceneRootX, focalY - sceneRootY);

        outVector[0] = Math.round(maxDistance * xVector);
        outVector[1] = Math.round(maxDistance * yVector);
    
public voidcaptureEndValues(TransitionValues transitionValues)

        super.captureEndValues(transitionValues);
        captureValues(transitionValues);
    
public voidcaptureStartValues(TransitionValues transitionValues)

        super.captureStartValues(transitionValues);
        captureValues(transitionValues);
    
private voidcaptureValues(TransitionValues transitionValues)

        View view = transitionValues.view;
        view.getLocationOnScreen(mTempLoc);
        int left = mTempLoc[0];
        int top = mTempLoc[1];
        int right = left + view.getWidth();
        int bottom = top + view.getHeight();
        transitionValues.values.put(PROPNAME_SCREEN_BOUNDS, new Rect(left, top, right, bottom));
    
public android.animation.AnimatoronAppear(android.view.ViewGroup sceneRoot, android.view.View view, TransitionValues startValues, TransitionValues endValues)

        if (endValues == null) {
            return null;
        }
        Rect bounds = (Rect) endValues.values.get(PROPNAME_SCREEN_BOUNDS);
        float endX = view.getTranslationX();
        float endY = view.getTranslationY();
        calculateOut(sceneRoot, bounds, mTempLoc);
        float startX = endX + mTempLoc[0];
        float startY = endY + mTempLoc[1];

        return TranslationAnimationCreator.createAnimation(view, endValues, bounds.left, bounds.top,
                startX, startY, endX, endY, sDecelerate);
    
public android.animation.AnimatoronDisappear(android.view.ViewGroup sceneRoot, android.view.View view, TransitionValues startValues, TransitionValues endValues)

        if (startValues == null) {
            return null;
        }
        Rect bounds = (Rect) startValues.values.get(PROPNAME_SCREEN_BOUNDS);
        int viewPosX = bounds.left;
        int viewPosY = bounds.top;
        float startX = view.getTranslationX();
        float startY = view.getTranslationY();
        float endX = startX;
        float endY = startY;
        int[] interruptedPosition = (int[]) startValues.view.getTag(R.id.transitionPosition);
        if (interruptedPosition != null) {
            // We want to have the end position relative to the interrupted position, not
            // the position it was supposed to start at.
            endX += interruptedPosition[0] - bounds.left;
            endY += interruptedPosition[1] - bounds.top;
            bounds.offsetTo(interruptedPosition[0], interruptedPosition[1]);
        }
        calculateOut(sceneRoot, bounds, mTempLoc);
        endX += mTempLoc[0];
        endY += mTempLoc[1];

        return TranslationAnimationCreator.createAnimation(view, startValues,
                viewPosX, viewPosY, startX, startY, endX, endY, sAccelerate);