package com.kaichunlin.transition;
import android.support.annotation.CheckResult;
import android.support.annotation.Nullable;
import android.support.annotation.UiThread;
import com.kaichunlin.transition.internal.TransitionController;
import com.kaichunlin.transition.internal.TransitionControllerManager;
import com.kaichunlin.transition.util.TransitionStateLogger;
/**
* Provides transitions effects to all views other than one controlled by {@link android.view.MenuItem}.
*/
@UiThread
public class ViewTransition extends AbstractTransition<ViewTransition, ViewTransition.Setup> {
private TransitionControllerManager transitionControllerManager;
public ViewTransition() {
this(null, null);
}
public ViewTransition(@Nullable Setup setup) {
this(null, setup);
}
/**
* @param id Unique ID that can identify the transition.
* @param setup Creates the {@link TransitionController}'s when {@link #startTransition()} is called.
*/
public ViewTransition(@Nullable String id, @Nullable Setup setup) {
super(id);
setSetup(setup);
}
@Override
public ViewTransition reverse() {
super.reverse();
if (transitionControllerManager != null) {
transitionControllerManager.reverse();
}
return self();
}
@Override
public boolean startTransition() {
//caches result
if (transitionControllerManager == null) {
transitionControllerManager = new TransitionControllerManager(getId());
if (mInterpolator != null) {
transitionControllerManager.setInterpolator(mInterpolator);
}
if (TransitionConfig.isDebug()) {
mTarget.setTag(R.id.debug_id, new TransitionStateLogger(getId()));
}
transitionControllerManager.setTarget(mTarget);
transitionControllerManager.setUpdateStateAfterUpdateProgress(mUpdateStateAfterUpdateProgress);
final int size = mSetupList.size();
for (int i = 0; i < size; i++) {
mSetupList.get(i).setupAnimation(transitionControllerManager);
}
if (mReverse) {
transitionControllerManager.reverse();
}
}
transitionControllerManager.start();
return true;
}
@Override
public void updateProgress(float progress) {
transitionControllerManager.updateProgress(progress);
}
@Override
public void stopTransition() {
if (transitionControllerManager != null) {
transitionControllerManager.end();
}
}
@CheckResult
@Override
public ViewTransition clone() {
ViewTransition newCopy = (ViewTransition) super.clone();
//set to null for now, equivalent to calling invalidate()
newCopy.transitionControllerManager = null;
return newCopy;
}
@Override
protected void invalidate() {
stopTransition();
transitionControllerManager = null;
}
@Override
protected ViewTransition self() {
return this;
}
/**
* Creates the {@link TransitionController}'s when {@link #startTransition()} is called.
*/
public interface Setup extends AbstractTransition.Setup {
/**
* @param manager The {@link TransitionControllerManager} that the created {@link TransitionController} should be added to
*/
void setupAnimation(TransitionControllerManager manager);
}
}