parent
f98ce6f6e4
commit
2e89356efe
@ -1,102 +0,0 @@ |
||||
package com.android.base.app.fragment; |
||||
|
||||
import android.content.Context; |
||||
import android.view.animation.Animation; |
||||
import android.view.animation.AnimationUtils; |
||||
|
||||
import com.android.base.R; |
||||
|
||||
import androidx.fragment.app.FragmentTransaction; |
||||
|
||||
public final class AnimatorHelper { |
||||
|
||||
private Animation noneAnim, noneAnimFixed; |
||||
private Animation enterAnim, exitAnim, popEnterAnim, popExitAnim; |
||||
|
||||
private Context context; |
||||
private FragmentAnimator fragmentAnimator; |
||||
|
||||
AnimatorHelper(Context context, FragmentAnimator fragmentAnimator) { |
||||
this.context = context; |
||||
notifyChanged(fragmentAnimator); |
||||
} |
||||
|
||||
void notifyChanged(FragmentAnimator fragmentAnimator) { |
||||
this.fragmentAnimator = fragmentAnimator; |
||||
if (fragmentAnimator != null) { |
||||
initEnterAnim(); |
||||
initExitAnim(); |
||||
initPopEnterAnim(); |
||||
initPopExitAnim(); |
||||
} |
||||
} |
||||
|
||||
public Animation getNoneAnim() { |
||||
if (noneAnim == null) { |
||||
noneAnim = AnimationUtils.loadAnimation(context, R.anim.no_anim); |
||||
} |
||||
return noneAnim; |
||||
} |
||||
|
||||
public Animation getNoneAnimFixed() { |
||||
if (noneAnimFixed == null) { |
||||
noneAnimFixed = new Animation() { |
||||
}; |
||||
} |
||||
return noneAnimFixed; |
||||
} |
||||
|
||||
private Animation initEnterAnim() { |
||||
if (fragmentAnimator.getEnter() == 0) { |
||||
enterAnim = AnimationUtils.loadAnimation(context, R.anim.no_anim); |
||||
} else { |
||||
enterAnim = AnimationUtils.loadAnimation(context, fragmentAnimator.getEnter()); |
||||
} |
||||
return enterAnim; |
||||
} |
||||
|
||||
private Animation initExitAnim() { |
||||
if (fragmentAnimator.getExit() == 0) { |
||||
exitAnim = AnimationUtils.loadAnimation(context, R.anim.no_anim); |
||||
} else { |
||||
exitAnim = AnimationUtils.loadAnimation(context, fragmentAnimator.getExit()); |
||||
} |
||||
return exitAnim; |
||||
} |
||||
|
||||
private Animation initPopEnterAnim() { |
||||
if (fragmentAnimator.getPopEnter() == 0) { |
||||
popEnterAnim = AnimationUtils.loadAnimation(context, R.anim.no_anim); |
||||
} else { |
||||
popEnterAnim = AnimationUtils.loadAnimation(context, fragmentAnimator.getPopEnter()); |
||||
} |
||||
return popEnterAnim; |
||||
} |
||||
|
||||
private Animation initPopExitAnim() { |
||||
if (fragmentAnimator.getPopExit() == 0) { |
||||
popExitAnim = AnimationUtils.loadAnimation(context, R.anim.no_anim); |
||||
} else { |
||||
popExitAnim = AnimationUtils.loadAnimation(context, fragmentAnimator.getPopExit()); |
||||
} |
||||
return popExitAnim; |
||||
} |
||||
|
||||
Animation onCreateAnimation(BaseFragment baseFragment, int transit, boolean enter, int nextAnim) { |
||||
if (transit == FragmentTransaction.TRANSIT_FRAGMENT_OPEN) { |
||||
if (enter) { |
||||
return enterAnim; |
||||
} else { |
||||
return popExitAnim; |
||||
} |
||||
} else if (transit == FragmentTransaction.TRANSIT_FRAGMENT_CLOSE) { |
||||
if (enter) { |
||||
return popEnterAnim; |
||||
} else { |
||||
return exitAnim; |
||||
} |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
} |
@ -1,44 +1,32 @@ |
||||
package com.android.base.app.fragment; |
||||
|
||||
import android.os.Parcel; |
||||
import android.os.Parcelable; |
||||
import android.view.animation.Animation; |
||||
import android.view.animation.AnimationUtils; |
||||
|
||||
import com.android.base.R; |
||||
import com.android.base.utils.BaseUtils; |
||||
|
||||
|
||||
public class DefaultHorizontalAnimator extends FragmentAnimator implements Parcelable { |
||||
public class DefaultHorizontalAnimator implements FragmentAnimator { |
||||
|
||||
public DefaultHorizontalAnimator() { |
||||
enter = R.anim.h_fragment_enter; |
||||
exit = R.anim.h_fragment_exit; |
||||
popEnter = R.anim.h_fragment_pop_enter; |
||||
popExit = R.anim.h_fragment_pop_exit; |
||||
@Override |
||||
public Animation makeOpenEnter() { |
||||
return AnimationUtils.loadAnimation(BaseUtils.getAppContext(), R.anim.h_fragment_open_enter); |
||||
} |
||||
|
||||
protected DefaultHorizontalAnimator(Parcel in) { |
||||
super(in); |
||||
@Override |
||||
public Animation makeOpenExit() { |
||||
return AnimationUtils.loadAnimation(BaseUtils.getAppContext(), R.anim.h_fragment_open_exit); |
||||
} |
||||
|
||||
@Override |
||||
public void writeToParcel(Parcel dest, int flags) { |
||||
super.writeToParcel(dest, flags); |
||||
public Animation makeCloseEnter() { |
||||
return AnimationUtils.loadAnimation(BaseUtils.getAppContext(), R.anim.h_fragment_close_enter); |
||||
} |
||||
|
||||
@Override |
||||
public int describeContents() { |
||||
return 0; |
||||
public Animation makeCloseExit() { |
||||
return AnimationUtils.loadAnimation(BaseUtils.getAppContext(), R.anim.h_fragment_close_exit); |
||||
} |
||||
|
||||
public static final Creator<DefaultHorizontalAnimator> CREATOR = new Creator<DefaultHorizontalAnimator>() { |
||||
@Override |
||||
public DefaultHorizontalAnimator createFromParcel(Parcel in) { |
||||
return new DefaultHorizontalAnimator(in); |
||||
} |
||||
|
||||
@Override |
||||
public DefaultHorizontalAnimator[] newArray(int size) { |
||||
return new DefaultHorizontalAnimator[size]; |
||||
} |
||||
}; |
||||
|
||||
} |
@ -1,42 +1,32 @@ |
||||
package com.android.base.app.fragment; |
||||
|
||||
|
||||
import android.os.Parcel; |
||||
import android.os.Parcelable; |
||||
import android.view.animation.Animation; |
||||
import android.view.animation.AnimationUtils; |
||||
|
||||
public class DefaultNoAnimator extends FragmentAnimator implements Parcelable { |
||||
import com.android.base.R; |
||||
import com.android.base.utils.BaseUtils; |
||||
|
||||
public DefaultNoAnimator() { |
||||
enter = 0; |
||||
exit = 0; |
||||
popEnter = 0; |
||||
popExit = 0; |
||||
} |
||||
public class DefaultNoAnimator implements FragmentAnimator { |
||||
|
||||
protected DefaultNoAnimator(Parcel in) { |
||||
super(in); |
||||
@Override |
||||
public Animation makeOpenEnter() { |
||||
return AnimationUtils.loadAnimation(BaseUtils.getAppContext(), R.anim.base_no_anim); |
||||
} |
||||
|
||||
@Override |
||||
public void writeToParcel(Parcel dest, int flags) { |
||||
super.writeToParcel(dest, flags); |
||||
public Animation makeOpenExit() { |
||||
return AnimationUtils.loadAnimation(BaseUtils.getAppContext(), R.anim.base_no_anim); |
||||
} |
||||
|
||||
@Override |
||||
public int describeContents() { |
||||
return 0; |
||||
public Animation makeCloseEnter() { |
||||
return AnimationUtils.loadAnimation(BaseUtils.getAppContext(), R.anim.base_no_anim); |
||||
} |
||||
|
||||
public static final Creator<DefaultNoAnimator> CREATOR = new Creator<DefaultNoAnimator>() { |
||||
@Override |
||||
public DefaultNoAnimator createFromParcel(Parcel in) { |
||||
return new DefaultNoAnimator(in); |
||||
} |
||||
|
||||
@Override |
||||
public DefaultNoAnimator[] newArray(int size) { |
||||
return new DefaultNoAnimator[size]; |
||||
} |
||||
}; |
||||
@Override |
||||
public Animation makeCloseExit() { |
||||
return AnimationUtils.loadAnimation(BaseUtils.getAppContext(), R.anim.base_no_anim); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,56 @@ |
||||
package com.android.base.app.fragment; |
||||
|
||||
|
||||
import android.view.animation.AlphaAnimation; |
||||
import android.view.animation.Animation; |
||||
import android.view.animation.AnimationSet; |
||||
import android.view.animation.DecelerateInterpolator; |
||||
import android.view.animation.Interpolator; |
||||
import android.view.animation.ScaleAnimation; |
||||
|
||||
|
||||
public class DefaultScaleAnimator implements FragmentAnimator { |
||||
|
||||
private static final Interpolator DECELERATE_QUINT = new DecelerateInterpolator(2.5f); |
||||
private static final Interpolator DECELERATE_CUBIC = new DecelerateInterpolator(1.5f); |
||||
|
||||
private static final int ANIM_DUR = 220; |
||||
|
||||
@Override |
||||
public Animation makeOpenEnter() { |
||||
return makeOpenCloseAnimation(1.125f, 1.0f, 0, 1); |
||||
} |
||||
|
||||
@Override |
||||
public Animation makeOpenExit() { |
||||
return makeOpenCloseAnimation(1.0f, .975f, 1, 0); |
||||
} |
||||
|
||||
@Override |
||||
public Animation makeCloseEnter() { |
||||
return makeOpenCloseAnimation(.975f, 1.0f, 0, 1); |
||||
} |
||||
|
||||
@Override |
||||
public Animation makeCloseExit() { |
||||
return makeOpenCloseAnimation(1.0f, 1.075f, 1, 0); |
||||
} |
||||
|
||||
private static Animation makeOpenCloseAnimation(float startScale, float endScale, float startAlpha, float endAlpha) { |
||||
AnimationSet set = new AnimationSet(false); |
||||
|
||||
ScaleAnimation scale = new ScaleAnimation(startScale, endScale, startScale, endScale, |
||||
Animation.RELATIVE_TO_SELF, .5f, Animation.RELATIVE_TO_SELF, .5f); |
||||
scale.setInterpolator(DECELERATE_QUINT); |
||||
scale.setDuration(ANIM_DUR); |
||||
set.addAnimation(scale); |
||||
|
||||
AlphaAnimation alpha = new AlphaAnimation(startAlpha, endAlpha); |
||||
alpha.setInterpolator(DECELERATE_CUBIC); |
||||
alpha.setDuration(ANIM_DUR); |
||||
set.addAnimation(alpha); |
||||
|
||||
return set; |
||||
} |
||||
|
||||
} |
@ -1,43 +1,31 @@ |
||||
package com.android.base.app.fragment; |
||||
|
||||
import android.os.Parcel; |
||||
import android.os.Parcelable; |
||||
import android.view.animation.Animation; |
||||
import android.view.animation.AnimationUtils; |
||||
|
||||
import com.android.base.R; |
||||
import com.android.base.utils.BaseUtils; |
||||
|
||||
public class DefaultVerticalAnimator extends FragmentAnimator implements Parcelable { |
||||
public class DefaultVerticalAnimator implements FragmentAnimator { |
||||
|
||||
public DefaultVerticalAnimator() { |
||||
enter = R.anim.v_fragment_enter; |
||||
exit = R.anim.v_fragment_exit; |
||||
popEnter = R.anim.v_fragment_pop_enter; |
||||
popExit = R.anim.v_fragment_pop_exit; |
||||
@Override |
||||
public Animation makeOpenEnter() { |
||||
return AnimationUtils.loadAnimation(BaseUtils.getAppContext(), R.anim.v_fragment_open_enter); |
||||
} |
||||
|
||||
protected DefaultVerticalAnimator(Parcel in) { |
||||
super(in); |
||||
@Override |
||||
public Animation makeOpenExit() { |
||||
return AnimationUtils.loadAnimation(BaseUtils.getAppContext(), R.anim.v_fragment_open_exit); |
||||
} |
||||
|
||||
@Override |
||||
public void writeToParcel(Parcel dest, int flags) { |
||||
super.writeToParcel(dest, flags); |
||||
public Animation makeCloseEnter() { |
||||
return AnimationUtils.loadAnimation(BaseUtils.getAppContext(), R.anim.v_fragment_close_enter); |
||||
} |
||||
|
||||
@Override |
||||
public int describeContents() { |
||||
return 0; |
||||
public Animation makeCloseExit() { |
||||
return AnimationUtils.loadAnimation(BaseUtils.getAppContext(), R.anim.v_fragment_close_exit); |
||||
} |
||||
|
||||
public static final Creator<DefaultVerticalAnimator> CREATOR = new Creator<DefaultVerticalAnimator>() { |
||||
@Override |
||||
public DefaultVerticalAnimator createFromParcel(Parcel in) { |
||||
return new DefaultVerticalAnimator(in); |
||||
} |
||||
|
||||
@Override |
||||
public DefaultVerticalAnimator[] newArray(int size) { |
||||
return new DefaultVerticalAnimator[size]; |
||||
} |
||||
}; |
||||
|
||||
} |
@ -1,105 +1,15 @@ |
||||
package com.android.base.app.fragment; |
||||
|
||||
import android.os.Parcel; |
||||
import android.os.Parcelable; |
||||
import android.view.animation.Animation; |
||||
|
||||
import androidx.annotation.AnimRes; |
||||
public interface FragmentAnimator { |
||||
|
||||
public class FragmentAnimator implements Parcelable { |
||||
Animation makeOpenEnter(); |
||||
|
||||
@AnimRes protected int enter; |
||||
@AnimRes protected int exit; |
||||
@AnimRes protected int popEnter; |
||||
@AnimRes protected int popExit; |
||||
Animation makeOpenExit(); |
||||
|
||||
public FragmentAnimator() { |
||||
} |
||||
Animation makeCloseEnter(); |
||||
|
||||
public FragmentAnimator(int enter, int exit) { |
||||
this.enter = enter; |
||||
this.exit = exit; |
||||
} |
||||
|
||||
public FragmentAnimator(int enter, int exit, int popEnter, int popExit) { |
||||
this.enter = enter; |
||||
this.exit = exit; |
||||
this.popEnter = popEnter; |
||||
this.popExit = popExit; |
||||
} |
||||
|
||||
public FragmentAnimator copy() { |
||||
return new FragmentAnimator(getEnter(), getExit(), getPopEnter(), getPopExit()); |
||||
} |
||||
|
||||
protected FragmentAnimator(Parcel in) { |
||||
enter = in.readInt(); |
||||
exit = in.readInt(); |
||||
popEnter = in.readInt(); |
||||
popExit = in.readInt(); |
||||
} |
||||
|
||||
public static final Creator<FragmentAnimator> CREATOR = new Creator<FragmentAnimator>() { |
||||
@Override |
||||
public FragmentAnimator createFromParcel(Parcel in) { |
||||
return new FragmentAnimator(in); |
||||
} |
||||
|
||||
@Override |
||||
public FragmentAnimator[] newArray(int size) { |
||||
return new FragmentAnimator[size]; |
||||
} |
||||
}; |
||||
|
||||
public int getEnter() { |
||||
return enter; |
||||
} |
||||
|
||||
public FragmentAnimator setEnter(int enter) { |
||||
this.enter = enter; |
||||
return this; |
||||
} |
||||
|
||||
public int getExit() { |
||||
return exit; |
||||
} |
||||
|
||||
/** |
||||
* enter animation |
||||
*/ |
||||
public FragmentAnimator setExit(int exit) { |
||||
this.exit = exit; |
||||
return this; |
||||
} |
||||
|
||||
public int getPopEnter() { |
||||
return popEnter; |
||||
} |
||||
|
||||
public FragmentAnimator setPopEnter(int popEnter) { |
||||
this.popEnter = popEnter; |
||||
return this; |
||||
} |
||||
|
||||
public int getPopExit() { |
||||
return popExit; |
||||
} |
||||
|
||||
public FragmentAnimator setPopExit(int popExit) { |
||||
this.popExit = popExit; |
||||
return this; |
||||
} |
||||
|
||||
@Override |
||||
public int describeContents() { |
||||
return 0; |
||||
} |
||||
|
||||
@Override |
||||
public void writeToParcel(Parcel dest, int flags) { |
||||
dest.writeInt(enter); |
||||
dest.writeInt(exit); |
||||
dest.writeInt(popEnter); |
||||
dest.writeInt(popExit); |
||||
} |
||||
Animation makeCloseExit(); |
||||
|
||||
} |
@ -0,0 +1,103 @@ |
||||
package com.android.base.app.fragment; |
||||
|
||||
import android.content.Context; |
||||
import android.view.animation.Animation; |
||||
import android.view.animation.AnimationUtils; |
||||
|
||||
import com.android.base.R; |
||||
|
||||
import androidx.fragment.app.FragmentTransaction; |
||||
|
||||
public final class FragmentAnimatorHelper { |
||||
|
||||
private Context context; |
||||
private FragmentAnimator fragmentAnimator; |
||||
|
||||
FragmentAnimatorHelper(Context context, FragmentAnimator fragmentAnimator) { |
||||
this.context = context; |
||||
this.fragmentAnimator = fragmentAnimator; |
||||
} |
||||
|
||||
public void changeAnimation(FragmentAnimator fragmentAnimator) { |
||||
this.fragmentAnimator = fragmentAnimator; |
||||
} |
||||
|
||||
public Animation getNoneAnim() { |
||||
return AnimationUtils.loadAnimation(context, R.anim.base_no_anim); |
||||
} |
||||
|
||||
public Animation getNoneAnimFixed() { |
||||
return new Animation() { |
||||
}; |
||||
} |
||||
|
||||
private Animation initEnterAnim() { |
||||
if (fragmentAnimator == null) { |
||||
return AnimationUtils.loadAnimation(context, R.anim.base_no_anim); |
||||
} else { |
||||
Animation animation = fragmentAnimator.makeOpenEnter(); |
||||
if (animation == null) { |
||||
return AnimationUtils.loadAnimation(context, R.anim.base_no_anim); |
||||
} else { |
||||
return animation; |
||||
} |
||||
} |
||||
} |
||||
|
||||
private Animation initExitAnim() { |
||||
if (fragmentAnimator == null) { |
||||
return AnimationUtils.loadAnimation(context, R.anim.base_no_anim); |
||||
} else { |
||||
Animation animation = fragmentAnimator.makeOpenExit(); |
||||
if (animation == null) { |
||||
return AnimationUtils.loadAnimation(context, R.anim.base_no_anim); |
||||
} else { |
||||
return animation; |
||||
} |
||||
} |
||||
} |
||||
|
||||
private Animation initPopEnterAnim() { |
||||
if (fragmentAnimator == null) { |
||||
return AnimationUtils.loadAnimation(context, R.anim.base_no_anim); |
||||
} else { |
||||
Animation animation = fragmentAnimator.makeCloseEnter(); |
||||
if (animation == null) { |
||||
return AnimationUtils.loadAnimation(context, R.anim.base_no_anim); |
||||
} else { |
||||
return animation; |
||||
} |
||||
} |
||||
} |
||||
|
||||
private Animation initPopExitAnim() { |
||||
if (fragmentAnimator == null) { |
||||
return AnimationUtils.loadAnimation(context, R.anim.base_no_anim); |
||||
} else { |
||||
Animation animation = fragmentAnimator.makeCloseExit(); |
||||
if (animation == null) { |
||||
return AnimationUtils.loadAnimation(context, R.anim.base_no_anim); |
||||
} else { |
||||
return animation; |
||||
} |
||||
} |
||||
} |
||||
|
||||
Animation onCreateAnimation(int transit, boolean enter) { |
||||
if (transit == FragmentTransaction.TRANSIT_FRAGMENT_OPEN) { |
||||
if (enter) { |
||||
return initEnterAnim(); |
||||
} else { |
||||
return initExitAnim(); |
||||
} |
||||
} else if (transit == FragmentTransaction.TRANSIT_FRAGMENT_CLOSE) { |
||||
if (enter) { |
||||
return initPopEnterAnim(); |
||||
} else { |
||||
return initPopExitAnim(); |
||||
} |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,20 @@ |
||||
<?xml version="1.0" encoding="utf-8"?> |
||||
<set |
||||
xmlns:android="http://schemas.android.com/apk/res/android"> |
||||
|
||||
<translate |
||||
android:duration="300" |
||||
android:fromXDelta="0" |
||||
android:interpolator="@android:anim/accelerate_interpolator" |
||||
android:toXDelta="100%p" /> |
||||
|
||||
<alpha |
||||
android:fromAlpha="1.0" |
||||
android:toAlpha="0.9" |
||||
android:fillEnabled="true" |
||||
android:fillBefore="false" |
||||
android:fillAfter="true" |
||||
android:interpolator="@android:anim/decelerate_interpolator" |
||||
android:duration="300" /> |
||||
|
||||
</set> |
@ -1,10 +0,0 @@ |
||||
<?xml version="1.0" encoding="utf-8"?> |
||||
<set xmlns:android="http://schemas.android.com/apk/res/android"> |
||||
|
||||
<translate |
||||
android:duration="300" |
||||
android:fromXDelta="0" |
||||
android:interpolator="@android:anim/accelerate_interpolator" |
||||
android:toXDelta="100%p" /> |
||||
|
||||
</set> |
@ -0,0 +1,19 @@ |
||||
<?xml version="1.0" encoding="utf-8"?> |
||||
<set |
||||
xmlns:android="http://schemas.android.com/apk/res/android" |
||||
android:duration="300"> |
||||
|
||||
<translate |
||||
android:fromXDelta="0%p" |
||||
android:toXDelta="-26%p" /> |
||||
|
||||
<alpha |
||||
android:fromAlpha="1.0" |
||||
android:toAlpha="0.3" |
||||
android:fillEnabled="true" |
||||
android:fillBefore="false" |
||||
android:fillAfter="true" |
||||
android:interpolator="@android:anim/decelerate_interpolator" |
||||
android:duration="300" /> |
||||
|
||||
</set> |
@ -1,9 +0,0 @@ |
||||
<?xml version="1.0" encoding="utf-8"?> |
||||
<set xmlns:android="http://schemas.android.com/apk/res/android" |
||||
android:duration="300"> |
||||
|
||||
<translate |
||||
android:fromXDelta="0%p" |
||||
android:toXDelta="-26%p" /> |
||||
|
||||
</set> |
@ -1,9 +0,0 @@ |
||||
<?xml version="1.0" encoding="utf-8"?> |
||||
<set xmlns:android="http://schemas.android.com/apk/res/android" |
||||
android:duration="300"> |
||||
|
||||
<alpha |
||||
android:fromAlpha="1.0" |
||||
android:toAlpha="1.0" /> |
||||
|
||||
</set> |
Loading…
Reference in new issue