我不知道为什么总是那么难以开始工作。我正在使用AppCompat库和android.app.Fragment
。我尝试添加动画来向左/右滑动新片段(就像iOS一样),但是当添加片段时,它们会立即添加/删除,而不需要任何动画。
我做错了什么?
getFragmentManager()
.beginTransaction()
.setCustomAnimations(R.animator.slide_in_from_right, R.animator.slide_out_to_the_left)
.add(R.id.navrootlayout, fragment)
.addToBackStack(null)
.commit();
RES /动画/ slide_in_from_right.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<objectAnimator
android:interpolator="@interpolator/decelerate_cubic"
android:valueFrom="1"
android:valueTo="0"
android:valueType="floatType"
android:propertyName="xFraction"
android:duration="3000"/>
</set>
RES /动画/ slide_out_to_the_left.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<objectAnimator
android:interpolator="@interpolator/decelerate_cubic"
android:valueFrom="0"
android:valueTo="-1"
android:valueType="floatType"
android:propertyName="xFraction"
android:duration="3000"/>
</set>
我甚至将动画的持续时间设置为3000(即3秒),以便我可以完全确定它是否被使用,但事实并非如此。添加片段时没有任何动画。我捕捉到了它发生的屏幕视频,新片段立即出现(并最终消失)。
答案 0 :(得分:1)
我弄清楚我做错了什么。我从某个地方的例子中抓取了动画xml文件,这个例子没有提到我需要自己实现xFraction
属性。我错误地认为这是一个内置行为,可以理解xFraction和x是相关的,类似于旧样式res/anim
样式动画允许您使用百分比值作为动画开始/结束值的方式。
但是,不,不。为此,您必须创建布局的子类并自己添加xFraction
属性。这就是我做到的。
package com.mydomain.myapp;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.RelativeLayout;
public class SlideableLayout extends RelativeLayout {
public SlideableLayout(Context context) {
super(context);
}
public SlideableLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public SlideableLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
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();
if (width > 0) {
setX(xFraction * width);
} else {
setX(-10000);
}
}
}
然后,对于我想在屏幕上和屏幕上设置动画的每个片段,我使用SlideableLayout
作为根布局。
<?xml version="1.0" encoding="utf-8"?>
<com.mydomain.myapp.SlideableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/holo_blue_bright"
>
</com.mydomain.myapp.SlideableLayout>