Android 片段自定义动画在棒棒糖中不起作用
我有下面的代码来设置片段的进入和退出动画Android 片段自定义动画在棒棒糖中不起作用,android,android-fragments,Android,Android Fragments,我有下面的代码来设置片段的进入和退出动画 final FragmentManager manager = getSupportFragmentManager(); final FragmentTransaction ft = manager.beginTransaction(); ft.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left, R.anim.slide_in_left, R.anim.slide_o
final FragmentManager manager = getSupportFragmentManager();
final FragmentTransaction ft = manager.beginTransaction();
ft.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left, R.anim.slide_in_left, R.anim.slide_out_right);
ft.replace(R.id.container, fragment, tag);
ft.addToBackStack(tag);
ft.commitAllowingStateLoss();
在左.xml中滑动
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromXDelta="-100%"
android:toXDelta="0%"
android:duration="@integer/slide_anim_duration" />
</set>
对所有其他动画使用相同的方法。在所有其他版本中都可以正常工作,但问题只存在于棒棒糖中。当我们查看函数时setCustomAnimations(int-enter、int-exit、int-popEnter、int-popExit)
,enter
和exit
工作正常,但是pocenter
和popeexit
在棒棒糖中失败。请告诉我哪里出了问题,并提供一个兼容的解决方案,可以从Android2.3到5.1运行
更新:
仔细观察,似乎动画在那里,但持续时间没有影响。您还可以在所有片段中尝试使用CreateAnimator..或它们正在扩展的基本片段
@target_api 20 or higher
@Override
public Animator onCreateAnimator(int transit, boolean enter, int nextAnim) {
if (enter) {
return AnimatorInflater.loadAnimator(getActivity(), R.animator.slide_in_top);
} else {
return AnimatorInflater.loadAnimator(getActivity(), R.animator.fade_out);
}
}
注意以上两个动画师都是预定义的,R是android.R
希望这有帮助
干杯 片段动画甚至在L之前就已中断-更改屏幕方向时存在一些问题 下面的解决方案修复了L问题和早期的方向更改问题。将其用作基本片段类
公共抽象类AnimatedSupportFragment扩展了DaggerFragment{
私有静态最终字符串状态\u ENTER\u ANIM=“STATE\u ENTER\u ANIM”;
私有静态最终字符串STATE\u EXIT\u ANIM=“STATE\u EXIT\u ANIM”;
私有静态最终字符串状态\u POP\u ENTER\u ANIM=“STATE\u POP\u ENTER\u ANIM”;
私有静态最终字符串STATE\u POP\u EXIT\u ANIM=“STATE\u POP\u EXIT\u ANIM”;
私有静态最终字符串状态\u更改\u配置=“状态\u更改\u配置”;
私有@AnimRes int-mEnter=0;
私有@AnimRes int mExit=0;
私有@AnimRes int mpoppenter=0;
私有@AnimRes int mPopExit=0;
私有布尔值mIsChangingConfigurations=false;
public void setCustomAnimations(@AnimRes int enterAnim,
@存在的动物,
@流行动漫,
@动物与动物){
门特=肠内营养素;
mExit=exitAnim;
mPopEnter=爆米花;
mPopExit=popExitAnim;
}
@在创建时覆盖公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
如果(savedInstanceState!=null){
mEnter=savedInstanceState.getInt(STATE\u ENTER\u ANIM);
mExit=savedInstanceState.getInt(STATE\u EXIT\u ANIM);
mpopener=savedInstanceState.getInt(STATE\u POP\u ENTER\u ANIM);
mPopExit=savedInstanceState.getInt(STATE\u POP\u EXIT\u ANIM);
mIsChangingConfigurations=savedInstanceState.getBoolean(状态改变配置);
}
}
@覆盖SaveInstanceState上的公共void(束超出状态){
super.onSaveInstanceState(超出状态);
超出状态。输入(状态、输入、输入);
outState.putInt(州、出口、出口);
outState.putInt(STATE\u POP\u ENTER\u ANIM,mpopener);
outState.putInt(州/市/区/出口/动画,mPopExit);
outState.putBoolean(状态改变配置、错误更改配置);
}
@重写公共void onResume(){
super.onResume();
错误配置=错误;
}
@重写公共void onPause(){
super.onPause();
if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.HONEYCOMB){
mIsChangingConfigurations=getActivity().isChangingConfigurations();
}
}
@SuppressLint(“新API”)
@重写公共动画onCreateAnimation(int transit、布尔输入、int nextAnim){
//此实现修复了方向更改时丢失的过渡动画:
//@见http://stackoverflow.com/questions/8837408/fragment-lost-transition-animation-after-configuration-change
//@见https://code.google.com/p/android/issues/detail?id=25994&can=4&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars
if(Build.VERSION.SDK\u INT播放它!
anim=nextAnim;
}否则{
//动画可能丢失了以片段状态保存的动画。
//enter=我们将要玩popEnterAnim,在另一种情况下是popExitAnimation
anim=输入?mpoppenter:mPopExit;
}
如果(动画!=0){
返回AnimationUtils.loadAnimation(getActivity(),anim);
}
}捕获(异常忽略){}
返回null;
}
}
如果将持续时间设置为2000,您将看到动画,但我认为它太慢了。这是我的代码:
你可以减少持续时间,但你会看到更少的动画。我找到了另一种解决方案,它制作的动画并不完全相同,但非常相似,与传统幻灯片相比,我更喜欢此动画这是我制作动画的代码:
private Fragment fragment=new Fragment();
private FragmentManager fragmentManager=getSupportFragmentManager();
private void replaceFragmentWithAnimation(){
FragmentTransaction ft = fragmentManager.beginTransaction();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && fragment != null) {
Slide slideLeft = new Slide(Gravity.RIGHT);
slideLeft.setDuration(300);
fragment.setExitTransition(slideLeft);
}
fragment = CalendarFragment.newInstance(selectedDays, plusMonths);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Slide slideRight = new Slide(Gravity.RIGHT);
slideRight.setDuration(350);
fragment.setEnterTransition(slideRight);
} else {
ft.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_right);
}
ft.replace(calendarDaysContFL.getId(), fragment);
ft.commit();
}
以下是工作解决方案: @jskierbi-answer的修改版本
import android.support.v4.app.Fragment;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
/**
* @author : Pedramrn@gmail.com Created on: 2016-02-19
*/
public class SupportBaseFragment extends Fragment {
private boolean mIsChangingConfigurations = false;
private static final String STATE_CHANGING_CONFIGURATIONS = "STATE_CHANGING_CONFIGURATIONS";
@Override
public void onResume() {
super.onResume();
mIsChangingConfigurations = false;
}
@Override
public void onPause() {
super.onPause();
mIsChangingConfigurations = getActivity().isChangingConfigurations();
}
@Override
public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) {
if (mIsChangingConfigurations)
return null;
if (enter)
return AnimationUtils.loadAnimation(getContext(), nextAnim == 0 ? R.anim.enter_pop : nextAnim);
else
return AnimationUtils.loadAnimation(getContext(), nextAnim == 0 ? R.anim.exit_pop : nextAnim);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
mIsChangingConfigurations = savedInstanceState.getBoolean(STATE_CHANGING_CONFIGURATIONS);
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean(STATE_CHANGING_CONFIGURATIONS, mIsChangingConfigurations);
}
enter.xml
<?xml version="1.0" encoding="utf-8"?>
<set>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="@android:integer/config_mediumAnimTime"
android:fromXDelta="100%"
android:interpolator="@android:anim/decelerate_interpolator"
android:toXDelta="0"/>
</set>
您是否尝试过其他动画来检查问题是否存在于左.xml中的特定
幻灯片中?此外,您是否在不同的设备上进行了测试?这个问题是在模拟器上发生的吗?@Ricardo是的,我用了这么多类似的动画。除了棒棒糖中的popEnter
和popExit
外,其他功能都可以正常工作。问题在于使用棒棒糖的设备。没有尝试emulator。我几乎有
<?xml version="1.0" encoding="utf-8"?>
<set>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="@android:integer/config_mediumAnimTime"
android:fromXDelta="100%"
android:interpolator="@android:anim/decelerate_interpolator"
android:toXDelta="0"/>
</set>
<?xml version="1.0" encoding="utf-8"?>
<set>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="@android:integer/config_mediumAnimTime"
android:fromXDelta="-100%"
android:interpolator="@android:anim/decelerate_interpolator"
android:toXDelta="0"/>
</set>
<?xml version="1.0" encoding="utf-8"?>
<set>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="@android:integer/config_mediumAnimTime"
android:fromXDelta="0"
android:interpolator="@android:anim/accelerate_interpolator"
android:toXDelta="-100%"/>
</set>
<?xml version="1.0" encoding="utf-8"?>
<set>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="@android:integer/config_mediumAnimTime"
android:fromXDelta="0"
android:interpolator="@android:anim/accelerate_interpolator"
android:toXDelta="100%"/>
</set>
getSupportFragmentManager()
.beginTransaction()
.setCustomAnimations(R.anim.enter, R.anim.exit,
R.anim.enter_pop, R.anim.exit_pop)
.replace(R.id.fragment_container, myFancyFragment)
.addToBackStack(null)
.commit();