我希望达到一个特定的片段转换行为,正如我在问题中提到的,我希望我的片段从右边出现,然后以相同的方向消失回到它开始的点。 这些是我的xml动画:
right_to_left.xml:
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<translate
android:duration="1000"
android:fromXDelta="100%"
android:fromYDelta="0%"
android:toXDelta="0%"
android:toYDelta="0%" />
left_to_right.xml
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="1000"
android:fromXDelta="0%"
android:fromYDelta="0%"
android:toXDelta="-100%"
android:toYDelta="0%" />
以下是我尝试实现片段动画的不同方法:
片段出现时:
productHolder.fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Bundle bundle = new Bundle();
bundle.putSerializable(Utils.productDetailsKey, productPojo);
ProductDetailsFragment productDetailsFragment = new ProductDetailsFragment();
productDetailsFragment.setArguments(bundle);
FragmentManager fragmentManager = activity.getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.setCustomAnimations(R.anim.product_animation_enter, R.anim.product_animation_enter);
transaction.add(R.id.newContainer, productDetailsFragment);
transaction.commit();
MainActivity.transparent.setBackgroundColor(ContextCompat.getColor(context, R.color.blackTransparent));
}
});
当片段消失时方法1:
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.setCustomAnimations(R.anim.product_animation_exit, R.anim.product_animation_exit);
transaction.remove(ProductDetailsFragment.this);
transaction.commitAllowingStateLoss();
MainActivity.transparent.setBackgroundColor(0x00000000);
}
});
当片段消失时方法2:
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Animation animation = AnimationUtils.loadAnimation(getActivity(), R.anim.product_animation_exit);
animation.setDuration(getResources().getInteger(android.R.integer.config_mediumAnimTime));
animation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
try {
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.remove(ProductDetailsFragment.this);
transaction.commitAllowingStateLoss();
MainActivity.transparent.setBackgroundColor(0x00000000);
} catch (Exception e) {
}
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
getView().startAnimation(animation);
}
});
不幸的是,没有一个像我期望的那样工作, 愿这张图片可以解释我想要的更多内容:image 提前谢谢。
答案 0 :(得分:0)
我建议,首先你要解决问题的第一部分,即在片段之间切换,然后添加第二部分,即动画。
<强> 1。切换片段
在XML布局文件中,您取出属于片段的所有内容并添加Framelayout
。
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
在您的代码中,您可以像FrameLayout
那样引用{<1}}:
int containerId = R.id.fragment_container;
然后你有两个方法,一个用于添加第一个片段,另一个用于在两者之间来回切换。
add方法如下:
void addFrag(int containerId, Fragment firstFragment){
FragmentManager fragmentManager = activity.getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.add(containerId, firstFragment);
transaction.commit();
}
替换方法如下:
void replaceFrag(int containerId, Fragment newFragment){
FragmentManager fragmentManager = activity.getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(containerId, newFragment);
transaction.commit();
}
只要传递正确的片段,就可以使用此方法将任何片段替换为另一片段。 修改您还可以使用replaceFrag
方法 ,即使首次向容器添加片段也是如此。 编辑结束
<强> 2。动画强>
这真的很容易。您不需要制作自己的XML,因为滑动动画内置于Android中(因此请使用我在此处提供的确切ID)。您需要做的就是在添加或替换片段之前添加一行代码:
transaction.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right);
编辑由于这些内置动画从50%开始,但在我看来,它们看起来并不太好。您只需使用XML:
transaction.setCustomAnimations(R.anim.left_to_right,R.anim.right_to_left);
编辑结束