Android - 在同一XML文件上制作翻译和objectAnimator

Dio*_*ira 8 android fragmenttransaction

我一直试图在从一个片段滑动到另一个片段的同时制作3D立方体旋转效果.首先我使用的是翻译效果(在XML上)调用,FragmentTransaction.setCustomAnimations(...)然后,当打开/关闭片段时,我正在使用Camera classe进行旋转.

这工作很精细,但似乎我有太多(不要问我为什么)只使用XML文件使用所有这个动画.经过长时间的搜索,我发现我应该使用objectAnimator进行旋转.

跟着谷歌样本,我设法制作翻转动画.现在我需要翻译片段,让它们滑入并滑出.似乎我不能使用objectAnimator并在同一XML文件上转换效果.由于出现此错误:

java.lang.RuntimeException: Unknown animator name: translate at (...)
Run Code Online (Sandbox Code Playgroud)

关于如何制作滑动效果并同时使用objectAnimator的任何想法?

感谢您的时间!

代码我一直在使用:

card_flip_right_in.xml

<set xmlns:android="http://schemas.android.com/apk/res/android" >
    <!-- Before rotating, immediately set the alpha to 0. -->
    <objectAnimator
        android:duration="0"
        android:propertyName="alpha"
        android:valueFrom="1.0"
        android:valueTo="0.0" />

    <!-- Rotate. -->
    <objectAnimator
        android:duration="@integer/card_flip_time_full"
        android:interpolator="@android:interpolator/accelerate_decelerate"
        android:propertyName="rotationY"
        android:valueFrom="180"
        android:valueTo="0" />

    <!-- Half-way through the rotation (see startOffset), set the alpha to 1. -->
    <objectAnimator
        android:duration="1"
        android:propertyName="alpha"
        android:startOffset="@integer/card_flip_time_half"
        android:valueFrom="0.0"
        android:valueTo="1.0" />

</set>
Run Code Online (Sandbox Code Playgroud)

片段调用另一个片段:(在此2之间应该可以看到立方体旋转)

private void launchArticle(int prev, int pos){
        ArticleFragment newFragment = new ArticleFragment();
        Bundle args = new Bundle();
        args.putString("pos", pos);
        args.putInt("prev", prev);
        newFragment.setArguments(args);
        android.app.FragmentTransaction transaction = getFragmentManager().beginTransaction();
        Fragment currFrag = (Fragment)getFragmentManager().findFragmentById(R.id.headlines_fragment);
        if (currFrag != null) {
                transaction.hide(currFrag);
        }
        transaction.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
                );

        transaction.replace(R.id.fragment_container, newFragment, pos);
        transaction.addToBackStack(null);

        transaction.commit();
}
Run Code Online (Sandbox Code Playgroud)

更新:

我已经设法使用扩展我正在使用的片段的framelayout的类来解决上一个问题

SlidingFrameLayout.java

public class SlidingFrameLayout extends FrameLayout
{
    private static final String TAG = SlidingFrameLayout.class.getName();
    public SlidingFrameLayout(Context context) {
        super(context);
    }

    public SlidingFrameLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public float getXFraction()
    {
        final int width = getWidth();  
        if(width != 0) return getX() / getWidth();  
        else return getX();  
    }

    public void setXFraction(float xFraction) {
        final int width = getWidth();  
        setX((width > 0) ? (xFraction * width) : -9999);  
    }

    public float getYFraction()
    {
        final int height = getHeight();  
        if(height != 0) return getY() / getHeight(); else return getY();   
    }

    public void setYFraction(float yFraction) {
        final int height = getHeight();  
        setY((height > 0) ? (yFraction * height) : -9999);  
    }
}
Run Code Online (Sandbox Code Playgroud)

并将其添加到objectAnimator:

<!-- Move -->
    <objectAnimator
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="@integer/card_flip_time_full"
        android:interpolator="@android:anim/linear_interpolator"
        android:propertyName="xFraction"
        android:valueFrom="-1"
        android:valueTo="0" />
Run Code Online (Sandbox Code Playgroud)

这样做效果更好,但是旋转轴位于FrameLayout的中间并且它不会产生立方体的错觉......是否可以将旋转轴设置在某个点上?

Dio*_*ira 5

通过在扩展的FrameLayout上创建我自己的方法解决了该问题。这是扩展的FrameLayout中的代码:

//Rotate from Left to Right turning visible
    public float getRotateLeftRightIn(){
        return getRotationY();
    }
    public void setRotateLeftRightIn(int rotateLeftRightIn){
        setPivotX(getWidth());
        setPivotY(getHeight()/2);
        setRotationY(rotateLeftRightIn);
    }
Run Code Online (Sandbox Code Playgroud)

在XML上:

<!-- Rotate. -->
<objectAnimator
    android:duration="@integer/card_flip_time_full"
    android:interpolator="@android:interpolator/accelerate_decelerate"
    android:propertyName="rotateLeftRightIn"
    android:valueFrom="@integer/card_flip_rotation_off"
    android:valueTo="0" 
    android:valueType="intType"/>
Run Code Online (Sandbox Code Playgroud)

在这种情况下,@integer/card_flip_time_full代表整个动画的持续时间,@integer/card_flip_rotation_off代表度数(在这种情况下为-90%)。

之后,要使此动画正常工作,我要做的就是在启动片段时在自定义动画中设置xml文件。

transaction.setCustomAnimations(enter,exit,popEnter,popExit);
Run Code Online (Sandbox Code Playgroud)

希望这对某些人有用^^