活动之间的卡片翻转动画

时间:2013-03-09 11:01:53

标签: android animation android-fragments android-activity

如何活动之间的卡片翻转动画

http://developer.android.com/training/animation/cardflip.html

以上链接在静态布局之间切换..我想在具有动态布局的2个活动之间进行CardFlip ..谢谢提前.. :))

我有两项活动......

  1. 包含产品详情的Main_Activity(Say Galaxy s3)
  2. 查询用户搜索请求的Search_Activity ..
  3. Main_Activity中有一个搜索按钮。当您点击按钮时,Main_Activity视图必须卡片翻转到Search_Activity。同样,一旦用户选择了产品,它应该Card-Flip反之亦然。

    我尝试按照上面的URL中的说明实现..但它只在使用XML定义的两个静态布局之间翻转。我正在ActionBar

    中实施搜索

3 个答案:

答案 0 :(得分:37)

从我所拥有的你不能完全相同的卡在活动之间翻转。
但是,
正如您可能已经知道的那样,您需要overridePendingTransition()来激活活动之间的转换(doc here)。 现在你需要的只是一个动画资源来完成这个技巧。 我用过这些:
fade_in.xml

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android" >
<scale
    android:duration="200"
    android:fromXScale="0.0"
    android:fromYScale="1.0"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"
    android:pivotX="50%"
    android:pivotY="50%"
    android:startOffset="200"
    android:toXScale="1.0"
    android:toYScale="1.0" />

<alpha
    android:duration="1"
    android:fromAlpha="0.0"
    android:startOffset="200"
    android:toAlpha="1.0" />
</set>

fade_out.xml

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android" >
<scale
    android:duration="200"
    android:fromXScale="1.0"
    android:fromYScale="1.0"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"
    android:pivotX="50%"
    android:pivotY="50%"
    android:toXScale="0.0"
    android:toYScale="1.0" />

<alpha
    android:duration="1"
    android:fromAlpha="1.0"
    android:startOffset="200"
    android:toAlpha="0.0" />
</set>

请注意,旋转动画仅在给定枢轴位置(x,y坐标)的Z轴(进入屏幕的轴)周围旋转,因此您无法使用它绕Y轴翻转。
我所做的就是在保持高度的同时缩放中间的宽度,从而产生活动的幻觉。此外,当宽度为0时,进入和退出活动分别淡入和淡出,因此看起来它们正在切换。翻转动画的duration的{​​{1}}属性必须与两个动画的所有scale属性相同。
不完美,但为我做了伎俩。
希望它有所帮助。

答案 1 :(得分:4)

不可能在活动之间进行卡片翻转动画,就像接受的答案中所说的那样(只是将新活动从屏幕中间扩展到两侧)。

原因是,在调用overridePendingTransition()时,您只是将动画应用于活动,而不是当前打开的活动。

在链接到的(非常好的)教程中,总共有4个动画,每个转换有2个动画(一个用于进入屏幕的片段,另一个用于片段,&#39; ;退出屏幕)。

以下是我解决这个问题的方法,并在我的2个活动之间制作了翻转卡动画,但它对我的活动内容非常习惯。对于某些上下文,我的第一个活动包含一个全屏图像,我只是想将该图像翻转到另一个相同大小的视图。

  1. 通过调用overridePendingTransition(0, 0)
  2. 禁用自动窗口动画
  3. 在第二个活动的包中,为新活动传递足够的信息以重新创建视图(对我来说,它是图像的大小和位置,以及要加载的资源)
  4. 在新视图上设置onPreDrawListener,您可以在其中重新创建父活动的视图(在我的情况下为图像)
  5. 你只需翻转2个视图。为此,我重新编写了您发布的Flip Card片段转换教程中的代码,并使用ObjectAnimator s在代码中重写了该代码。
  6. 覆盖您的onBackPressed()方法以反向顺序运行相同的动画
  7. 使用此机制,您可以完全执行任何自定义转换,因为您只需在视图之间设置动画。 以下是有关该技术的更多信息:https://www.youtube.com/watch?v=ihzZrS69i_s#t=1001

答案 2 :(得分:2)

您可以在两个活动之间制作这样的卡片翻转动画(附赠gif)。

Card Flip animation between two activities

执行以下步骤:

首先在动画fade_in.xml中创建XML res > anim > fade_in.xml

fade_in.xml

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android" >
    <scale
        android:duration="2000"
        android:fromXScale="0.0"
        android:fromYScale="1.0"
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        android:pivotX="50%"
        android:pivotY="50%"
        android:startOffset="2000"
        android:toXScale="1.0"
        android:toYScale="1.0" />

    <alpha
        android:duration="1"
        android:fromAlpha="0.0"
        android:startOffset="2000"
        android:toAlpha="1.0" />
</set>

然后在动画fade_out.xml中创建第二个XML res > anim > fade_out.xml

fade_out.xml

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android" >
    <scale
        android:duration="2000"
        android:fromXScale="1.0"
        android:fromYScale="1.0"
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toXScale="0.0"
        android:toYScale="1.0" />

    <alpha
        android:duration="1"
        android:fromAlpha="1.0"
        android:startOffset="2000" 
        android:toAlpha="0.0" />
</set>

创建两个动画XML之后,然后在res>value>style.xml内设置值

现在在style.xml仔细添加此代码,以便在所有活动中设置卡片翻转动画。(如果您希望在选定的两个活动之间设置此动画,请设置.java中的动画。)

style.xml

中添加代码
<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>    

                            <!-- add code below -->
       <item name="android:windowAnimationStyle">@style/CustomActivityAnimation</item>
   </style>

   <style name="CustomActivityAnimation" parent="@android:style/Animation.Activity">
       <item name="android:activityOpenEnterAnimation">@anim/fade_in</item>
       <item name="android:activityOpenExitAnimation">@anim/fade_out</item>
       <item name="android:activityCloseEnterAnimation">@anim/fade_in</item>
       <item name="android:activityCloseExitAnimation">@anim/fade_out</item>
   </style>

</resources>

谢谢!快乐编码:)