add fragment animation

androidx
Ztiany 5 years ago
parent 7b9fc382dc
commit f98ce6f6e4
  1. 16
      lib_base/src/main/java/com/android/base/adapter/pager/ViewPagerFragmentAdapter.java
  2. 4
      lib_base/src/main/java/com/android/base/adapter/pager/ViewPagerInfo.java
  3. 16
      lib_base/src/main/java/com/android/base/adapter/pager/ViewPagerStateFragmentAdapter.java
  4. 6
      lib_base/src/main/java/com/android/base/app/Sword.java
  5. 102
      lib_base/src/main/java/com/android/base/app/fragment/AnimatorHelper.java
  6. 12
      lib_base/src/main/java/com/android/base/app/fragment/BaseFragment.java
  7. 44
      lib_base/src/main/java/com/android/base/app/fragment/DefaultHorizontalAnimator.java
  8. 42
      lib_base/src/main/java/com/android/base/app/fragment/DefaultNoAnimator.java
  9. 43
      lib_base/src/main/java/com/android/base/app/fragment/DefaultVerticalAnimator.java
  10. 105
      lib_base/src/main/java/com/android/base/app/fragment/FragmentAnimator.java
  11. 11
      lib_base/src/main/java/com/android/base/app/fragment/FragmentConfig.java
  12. 10
      lib_base/src/main/res/anim/h_fragment_enter.xml
  13. 10
      lib_base/src/main/res/anim/h_fragment_exit.xml
  14. 9
      lib_base/src/main/res/anim/h_fragment_pop_enter.xml
  15. 9
      lib_base/src/main/res/anim/h_fragment_pop_exit.xml
  16. 5
      lib_base/src/main/res/anim/no_anim.xml
  17. 9
      lib_base/src/main/res/anim/pop_exit_no_anim.xml
  18. 40
      lib_base/src/main/res/anim/v_fragment_enter.xml
  19. 41
      lib_base/src/main/res/anim/v_fragment_exit.xml
  20. 30
      lib_base/src/main/res/anim/v_fragment_pop_enter.xml
  21. 30
      lib_base/src/main/res/anim/v_fragment_pop_exit.xml

@ -10,20 +10,20 @@ import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentPagerAdapter;
@SuppressWarnings("unused")
public class ViewPageFragmentAdapter extends FragmentPagerAdapter {
public class ViewPagerFragmentAdapter extends FragmentPagerAdapter {
private final List<ViewPageInfo> mTabs;
private final List<ViewPagerInfo> mTabs;
private Context mContext;
public ViewPageFragmentAdapter(FragmentManager fragmentManager, Context context) {
public ViewPagerFragmentAdapter(FragmentManager fragmentManager, Context context) {
super(fragmentManager);
mContext = context;
mTabs = new ArrayList<>();
}
public void setDataSource(List<ViewPageInfo> viewPageInfoList) {
public void setDataSource(List<ViewPagerInfo> viewPagerInfoList) {
mTabs.clear();
mTabs.addAll(viewPageInfoList);
mTabs.addAll(viewPagerInfoList);
}
@Override
@ -33,8 +33,8 @@ public class ViewPageFragmentAdapter extends FragmentPagerAdapter {
@Override
public Fragment getItem(int position) {
ViewPageInfo viewPageInfo = mTabs.get(position);
return Fragment.instantiate(mContext, viewPageInfo.clazz.getName(), viewPageInfo.args);
ViewPagerInfo viewPagerInfo = mTabs.get(position);
return Fragment.instantiate(mContext, viewPagerInfo.clazz.getName(), viewPagerInfo.args);
}
@Override
@ -42,7 +42,7 @@ public class ViewPageFragmentAdapter extends FragmentPagerAdapter {
return mTabs.get(position).title;
}
public List<ViewPageInfo> getTabs() {
public List<ViewPagerInfo> getTabs() {
return mTabs;
}
}

@ -5,13 +5,13 @@ import android.os.Bundle;
import androidx.fragment.app.Fragment;
@SuppressWarnings("all")
public class ViewPageInfo {
public class ViewPagerInfo {
public final Class<? extends Fragment> clazz;
public final Bundle args;
public final String title;
public ViewPageInfo(String title, Class<? extends Fragment> clazz, Bundle args) {
public ViewPagerInfo(String title, Class<? extends Fragment> clazz, Bundle args) {
this.title = title;
this.clazz = clazz;
this.args = args;

@ -11,20 +11,20 @@ import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentStatePagerAdapter;
public class ViewPageStateFragmentAdapter extends FragmentStatePagerAdapter {
public class ViewPagerStateFragmentAdapter extends FragmentStatePagerAdapter {
private final List<ViewPageInfo> mTabs;
private final List<ViewPagerInfo> mTabs;
private Context mContext;
public ViewPageStateFragmentAdapter(FragmentManager fragmentManager, Context context) {
public ViewPagerStateFragmentAdapter(FragmentManager fragmentManager, Context context) {
super(fragmentManager);
mContext = context;
mTabs = new ArrayList<>();
}
public void setDataSource(List<ViewPageInfo> viewPageInfoList) {
public void setDataSource(List<ViewPagerInfo> viewPagerInfoList) {
mTabs.clear();
mTabs.addAll(viewPageInfoList);
mTabs.addAll(viewPagerInfoList);
}
@Override
@ -35,8 +35,8 @@ public class ViewPageStateFragmentAdapter extends FragmentStatePagerAdapter {
@NotNull
@Override
public Fragment getItem(int position) {
ViewPageInfo viewPageInfo = mTabs.get(position);
return Fragment.instantiate(mContext, viewPageInfo.clazz.getName(), viewPageInfo.args);
ViewPagerInfo viewPagerInfo = mTabs.get(position);
return Fragment.instantiate(mContext, viewPagerInfo.clazz.getName(), viewPagerInfo.args);
}
@Override
@ -44,7 +44,7 @@ public class ViewPageStateFragmentAdapter extends FragmentStatePagerAdapter {
return mTabs.get(position).title;
}
protected List<ViewPageInfo> getTabs() {
protected List<ViewPagerInfo> getTabs() {
return mTabs;
}

@ -6,6 +6,7 @@ import android.content.Context;
import android.os.Bundle;
import com.android.base.app.dagger.Injectable;
import com.android.base.app.fragment.FragmentAnimator;
import com.android.base.app.fragment.FragmentConfig;
import com.android.base.app.fragment.LoadingViewFactory;
import com.android.base.app.ui.PageNumber;
@ -118,6 +119,11 @@ public final class Sword {
return this;
}
public Sword setDefaultFragmentAnimator(FragmentAnimator animator) {
FragmentConfig.setDefaultFragmentAnimator(animator);
return this;
}
public Sword enableAutoInject() {
Application.ActivityLifecycleCallbacks activityLifecycleCallbacks = new ActivityLifecycleCallbacksAdapter() {

@ -0,0 +1,102 @@
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;
}
}

@ -7,6 +7,7 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;
import android.view.animation.Animation;
import com.android.base.app.Sword;
import com.android.base.app.activity.BackHandlerHelper;
@ -45,6 +46,8 @@ public class BaseFragment extends Fragment implements LoadingView, OnBackPressLi
/* just for cache*/
private View mCachedView;
private AnimatorHelper mAnimatorHelper;
private final FragmentDelegates mFragmentDelegates = new FragmentDelegates(this);
private String tag() {
@ -295,4 +298,13 @@ public class BaseFragment extends Fragment implements LoadingView, OnBackPressLi
getLoadingViewImpl().showMessage(messageId);
}
@Nullable
@Override
public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) {
if (mAnimatorHelper == null) {
mAnimatorHelper = new AnimatorHelper(getContext(), FragmentConfig.defaultFragmentAnimator());
}
return mAnimatorHelper.onCreateAnimation(this, transit, enter, nextAnim);
}
}

@ -0,0 +1,44 @@
package com.android.base.app.fragment;
import android.os.Parcel;
import android.os.Parcelable;
import com.android.base.R;
public class DefaultHorizontalAnimator extends FragmentAnimator implements Parcelable {
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;
}
protected DefaultHorizontalAnimator(Parcel in) {
super(in);
}
@Override
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
}
@Override
public int describeContents() {
return 0;
}
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];
}
};
}

@ -0,0 +1,42 @@
package com.android.base.app.fragment;
import android.os.Parcel;
import android.os.Parcelable;
public class DefaultNoAnimator extends FragmentAnimator implements Parcelable {
public DefaultNoAnimator() {
enter = 0;
exit = 0;
popEnter = 0;
popExit = 0;
}
protected DefaultNoAnimator(Parcel in) {
super(in);
}
@Override
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
}
@Override
public int describeContents() {
return 0;
}
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];
}
};
}

@ -0,0 +1,43 @@
package com.android.base.app.fragment;
import android.os.Parcel;
import android.os.Parcelable;
import com.android.base.R;
public class DefaultVerticalAnimator extends FragmentAnimator implements Parcelable {
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;
}
protected DefaultVerticalAnimator(Parcel in) {
super(in);
}
@Override
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
}
@Override
public int describeContents() {
return 0;
}
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];
}
};
}

@ -0,0 +1,105 @@
package com.android.base.app.fragment;
import android.os.Parcel;
import android.os.Parcelable;
import androidx.annotation.AnimRes;
public class FragmentAnimator implements Parcelable {
@AnimRes protected int enter;
@AnimRes protected int exit;
@AnimRes protected int popEnter;
@AnimRes protected int popExit;
public FragmentAnimator() {
}
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);
}
}

@ -9,6 +9,7 @@ public class FragmentConfig {
private static final int INVALIDATE_ID = -1;
private static int sDefaultContainerId = INVALIDATE_ID;
private static FragmentAnimator sFragmentAnimator = null;
public static void setDefaultContainerId(int defaultContainerId) {
sDefaultContainerId = defaultContainerId;
@ -21,4 +22,12 @@ public class FragmentConfig {
return sDefaultContainerId;
}
}
public static void setDefaultFragmentAnimator(FragmentAnimator animator) {
sFragmentAnimator = animator;
}
static FragmentAnimator defaultFragmentAnimator() {
return sFragmentAnimator;
}
}

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="300"
android:fromXDelta="100%p"
android:interpolator="@android:anim/decelerate_interpolator"
android:toXDelta="0"/>
</set>

@ -0,0 +1,10 @@
<?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,9 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="300">
<translate
android:fromXDelta="-26%p"
android:toXDelta="0" />
</set>

@ -0,0 +1,9 @@
<?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>

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="0">
</set>

@ -0,0 +1,9 @@
<?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>

@ -0,0 +1,40 @@
<?xml version="1.0" encoding="utf-8"?><!--
/*
** Copyright 2009, 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.
*/
-->
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false"
android:zAdjustment="top">
<alpha
android:fromAlpha="0.0"
android:toAlpha="1.0"
android:interpolator="@android:anim/decelerate_interpolator"
android:fillEnabled="true"
android:fillBefore="false"
android:fillAfter="true"
android:duration="200" />
<translate
android:fromYDelta="8%"
android:toYDelta="0"
android:fillEnabled="true"
android:fillBefore="true"
android:fillAfter="true"
android:interpolator="@android:anim/decelerate_interpolator"
android:duration="300" />
</set>

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="utf-8"?><!--
/*
** Copyright 2009, 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.
*/
-->
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false"
android:zAdjustment="top">
<alpha
android:fromAlpha="1.0"
android:toAlpha="0.0"
android:interpolator="@android:anim/linear_interpolator"
android:fillEnabled="true"
android:fillBefore="false"
android:fillAfter="true"
android:startOffset="100"
android:duration="150" />
<translate
android:fromYDelta="0%"
android:toYDelta="8%"
android:fillEnabled="true"
android:fillBefore="true"
android:fillAfter="true"
android:interpolator="@android:anim/accelerate_interpolator"
android:duration="250" />
</set>

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?><!--
/*
** Copyright 2009, 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.
*/
-->
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:zAdjustment="normal">
<alpha
android:fromAlpha="0.7"
android:toAlpha="1.0"
android:fillEnabled="true"
android:fillBefore="true"
android:fillAfter="true"
android:interpolator="@android:anim/accelerate_interpolator"
android:duration="250" />
</set>

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?><!--
/*
** Copyright 2009, 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.
*/
-->
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:zAdjustment="normal">
<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>
Loading…
Cancel
Save