我有一个带有Fragments的ViewPager。每个片段都包含一个带有"卡片正面的ImageView"。刷卡显示下一张(或上一张)卡片。点击一个按钮可以随机提供其他卡片。点击另一个按钮会导致显示卡片背面的翻转卡片动画,或者如果已经显示背面,则向后翻转卡片动画(同一张卡片)。 为了获得翻转卡片动画,要设置动画的片段必须位于容器中,而不是直接在viewpager中。但是,当我尝试在viewpager中放置一个fragment-container(也是一个片段)时,整个viewpage机制就会搞砸了。正常滑动不再可能。
之前曾问过同样/类似的问题:https://stackoverflow.com/questions/22171069/how-can-i-animate-a-fragment-inside-a-viewpager?。接受的答案不是回答我的问题,但在评论中表明有更多人在寻找这个答案。
我已经浏览了大量的互联网,我会继续,但我决定在这里发布我的问题,因为我发现问题的大部分答案来自你,stackoverflow用户!
已编辑以澄清评论中的问题 我想要使用的动画使用容器作为p.e.在:
中指定 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:fitsSystemWindows="true"
tools:context="nl.xxx.xxx.xxxActivity"
tools:ignore="MergeRootFrame">
<LinearLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="15dp"
/>
</FrameLayout>
在动画之前,将带有imageView的片段添加到容器(FrontFragment)。这个片段的布局:
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/imageDisplay"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp"
tools:context="nl.xxx.xxx.xxxActivity" />
动画是(代码的一部分:)
mShowingBack = true;
// Create and commit a new fragment transaction that adds the fragment for the back of
// the card, uses custom animations, and is part of the fragment manager's back stack.
BackFragment achterkant= BackFragment.newInstance("blabla");
getFragmentManager()
.beginTransaction()
// Replace the default fragment animations with animator resources representing
// rotations when switching to the back of the card, as well as animator
// resources representing rotations when flipping back to the front (e.g. when
// the system Back button is pressed).
.setCustomAnimations(
R.animator.card_flip_right_in, R.animator.card_flip_right_out,
R.animator.card_flip_left_in, R.animator.card_flip_left_out)
// Replace any fragments currently in the container view with a fragment
.replace(R.id.container, achterkant)
// Add this transaction to the back stack, allowing users to press Back
// to get to the front of the card.
.addToBackStack(null)
// Commit the transaction.
.commit();
动画以xml文件形式给出,例如:card_flip_left_in.xml:
<set xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Before rotating, immediately set the alpha to 0. -->
<objectAnimator
android:valueFrom="1.0"
android:valueTo="0.0"
android:propertyName="alpha"
android:duration="0" />
<!-- Rotate. -->
<objectAnimator
android:valueFrom="-180"
android:valueTo="0"
android:propertyName="rotationY"
android:interpolator="@android:interpolator/accelerate_decelerate"
android:duration="@integer/card_flip_time_full" />
<!-- Half-way through the rotation (see startOffset), set the alpha to 1. -->
<objectAnimator
android:valueFrom="0.0"
android:valueTo="1.0"
android:propertyName="alpha"
android:startOffset="@integer/card_flip_time_half"
android:duration="1" />
上面的代码是从互联网上复制的,并且在非查看情况下完美运行。
答案 0 :(得分:0)
我自己找到了答案。 我将带有容器的Rootfragments添加到ViewPager。我在getChildFragmentManager()和上述objectanimators的帮助下替换/动画容器中的片段。
线索是因为我必须使用android.support.v13库(FragmentStatePagerAdapter),结合android.app.Fragment和android.app.FragmentTransaction。