package com.byoutline.kickmaterial.utils; import android.animation.Animator; import android.animation.ObjectAnimator; import android.annotation.TargetApi; import android.content.Context; import android.os.Build; import android.transition.Transition; import android.transition.TransitionValues; import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup; /** * Created by mount on 12/8/14. */ @TargetApi(Build.VERSION_CODES.LOLLIPOP) public class CustomSharedElementTransition extends Transition { private static final String PROPERTY_TRANSLATION_X = "custom:translationX"; private static final String PROPERTY_TRANSLATION_Z = "custom:translationZ"; private static final String[] PROPERTIES = {PROPERTY_TRANSLATION_X, PROPERTY_TRANSLATION_Z}; public CustomSharedElementTransition() { } public CustomSharedElementTransition(Context context, AttributeSet attrs) { super(context, attrs); } @Override public String[] getTransitionProperties() { return PROPERTIES; } private void captureValues(TransitionValues transitionValues) { float x = transitionValues.view.getTranslationX(); float z = transitionValues.view.getTranslationZ(); transitionValues.values.put(PROPERTY_TRANSLATION_X, x); transitionValues.values.put(PROPERTY_TRANSLATION_Z, z); } @Override public void captureStartValues(TransitionValues transitionValues) { captureValues(transitionValues); } @Override public void captureEndValues(TransitionValues transitionValues) { captureValues(transitionValues); } @Override public Animator createAnimator(ViewGroup sceneRoot, TransitionValues startValues, TransitionValues endValues) { if (!propertiesExistsInValues(startValues, endValues)) { return null; } final float startX = (Float) startValues.values.get(PROPERTY_TRANSLATION_X); final float endX = (Float) endValues.values.get(PROPERTY_TRANSLATION_X); final float startZ = (Float) startValues.values.get(PROPERTY_TRANSLATION_Z); final float endZ = (Float) endValues.values.get(PROPERTY_TRANSLATION_Z); final View view = endValues.view; view.setTranslationX(startX); view.setTranslationZ(startZ); // return ObjectAnimator.ofFloat(view, View.TRANSLATION_Z, startZ, endZ); return ObjectAnimator.ofFloat(view, View.TRANSLATION_X, startX, endX); } private boolean propertiesExistsInValues(TransitionValues startValues, TransitionValues endValues) { if (startValues == null || endValues == null) { return false; } for (String property : PROPERTIES) { if (!startValues.values.containsKey(property) || !endValues.values.containsKey(property)) { return false; } } return true; } }