我一直试图在从一个片段滑动到另一个片段的同时制作3D立方体旋转效果。
首先,我使用FragmentTransaction.setCustomAnimations(...)
调用的翻译效果(在XML上)然后,当打开/关闭片段时,我正在使用Camera classe进行旋转。
这工作很精细,但似乎我有太多(不要问我为什么)只使用XML文件来使用所有这个动画。经过长时间的搜索,我发现我应该使用objectAnimator进行旋转。
关注Google示例,我设法制作翻转动画。现在我需要翻译片段,让它们滑入并滑出。似乎我不能使用objectAnimator并在同一XML文件上转换效果。由于出现此错误:
java.lang.RuntimeException: Unknown animator name: translate at (...)
关于如何制作滑动效果并同时使用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>
片段调用另一个片段:(在此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();
}
更新
我设法使用扩展我正在使用的片段的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);
}
}
并将其添加到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" />
这样做效果更好,但是旋转轴位于FrameLayout的中间并且它不会产生立方体的错觉......是否可以将旋转轴设置在某个点上?
答案 0 :(得分:4)
通过在扩展的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);
}
关于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"/>
在这种情况下,@integer/card_flip_time_full
代表整个动画的持续时间,@integer/card_flip_rotation_off
代表度数(在这种情况下为-90%)。
在此之后,我需要做的就是让这个动画工作,在启动片段时,在自定义动画中设置xml文件
transaction.setCustomAnimations(enter,exit,popEnter,popExit);
希望这对某些人有用^^
答案 1 :(得分:-1)
接受答案的替代方法,您可以定义动画集,如下所示:
<item android:state_pressed="true">
<set>
<objectAnimator android:propertyName="translationZ"
android:duration="100"
android:valueTo="2"
android:valueType="floatType"/>
<!-- you could have other objectAnimator elements
here for "x" and "y", or other properties -->
</set>
</item>
<item android:state_enabled="true"
android:state_pressed="false"
android:state_focused="true">
<set>
<objectAnimator android:propertyName="translationZ"
android:duration="100"
android:valueTo="2"
android:valueType="floatType"/>
</set>
</item>