我只是想说这不是重复的,这个问题在堆栈溢出时没有得到解决
我在用户导航的应用程序中有多个片段。我在我的代码中有了支持库,但是我已经删除了它,当我使用它时,我用<translate>
动画片段。我现在改变了这一点,如果我在值中进行硬编码,就可以正常工作。由于我的应用程序将用于不同的屏幕密度,我无法做到这一点。因此,在研究和教程之后,我创建了自定义FrameLayout,如下所示:
public class CustomFrameLayout extends FrameLayout{
public CustomFrameLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public float getXFraction() {
return getX() / getWidth(); // TODO: guard divide-by-zero
}
public void setXFraction(float xFraction) {
// TODO: cache width
final int width = getWidth();
setX((width > 0) ? (xFraction * width) : -9999);
}
}
我的动画xml是:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/linear_interpolator"
android:valueFrom="1.0"
android:valueTo="0"
android:propertyName="xFraction"
android:duration="@android:integer/config_mediumAnimTime" />
</set>
我的主要活动布局是:
<com.axn.test.app.custom.CustomFrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container"
android:gravity="top"
android:layout_width="match_parent"
android:layout_height="match_parent" />
然后我有了设置自定义动画的代码:
FragmentTransaction ft = getActivity().getFragmentManager().beginTransaction();
ft.setCustomAnimations(R.animator.fragment_slide_in_right, R.animator.fragment_slide_in_right, R.animator.fragment_slide_in_right, R.animator.fragment_slide_out_right);
问题是当我更改片段时没有动画,我在控制台中得到以下内容:
W/PropertyValuesHolder﹕ Method setXFraction() with type float not found on target class class android.widget.RelativeLayout
因此,如果过去有人遇到过这个问题,或者知道如何解决这个问题,我会很感激。在我的customFrameLayout中setXFraction(float xFraction)
和getXFraction()
从未被调用过,因此我不确定从何处开始...所有输入都非常感谢
**编辑==== FRAGMENT LAYOUT ===== **
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/background"
>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<RelativeLayout
android:layout_marginTop="20dp"
android:layout_marginLeft="20dp"
android:id="@+id/show1"
android:layout_weight="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clickable="true">
<ImageView
android:id="@+id/poster1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/poster1"/>
<RelativeLayout
android:id="@+id/poster1Details"
android:background="@drawable/reflection1"
android:layout_below="@+id/poster1"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:id="@+id/poster1text"
android:layout_centerHorizontal="true"
android:textColor="@color/white"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="@string/poster1Title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/poster1text"
android:layout_centerHorizontal="true"
android:textColor="@color/white"
android:textAppearance="?android:attr/textAppearanceSmall"
android:text="@string/episode1"/>
</RelativeLayout>
</RelativeLayout>
<RelativeLayout
android:id="@+id/show2"
android:layout_weight="1"
android:layout_marginRight="10dp"
android:layout_marginTop="20dp"
android:layout_marginLeft="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clickable="true">
<ImageView
android:id="@+id/poster2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/poster2"/>
<RelativeLayout
android:id="@+id/poster2Details"
android:background="@drawable/reflection2"
android:layout_below="@+id/poster2"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:id="@+id/poster2text"
android:layout_centerHorizontal="true"
android:textColor="@color/white"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="@string/poster2Title"
android:gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/poster2text"
android:layout_centerHorizontal="true"
android:textColor="@color/white"
android:textAppearance="?android:attr/textAppearanceSmall"
android:text="@string/episode1"/>
</RelativeLayout>
</RelativeLayout>
</LinearLayout>
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true">
<ImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/logos_backgrounds"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/presents"
android:textColor="@color/white"
android:layout_centerHorizontal="true"
android:layout_marginTop="10dp"
/>
</RelativeLayout>
</RelativeLayout>
答案 0 :(得分:0)
问题在于您正在尝试为片段设置动画。不是活动。因此,您必须在要设置动画的片段上添加CustomFrameLayout。一旦您的交易发生,交易将为您片段的父级而不是您的活动的值设置动画。这就是你得到Method setXFraction() with type float not found on target class class android.widget.RelativeLayout
的原因。因为片段的父级是RelativeLayout,并且它没有setXFraction方法。
我仍然会留下其余的anwser,因为它可能会帮助别人。
<强> in_from_left.xml 强>
<objectAnimator
xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="500"
android:propertyName="x"
android:valueFrom="1000"
android:valueTo="0"
android:valueType="floatType" />
<强> in_from_right.xml 强>
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator
xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="500"
android:propertyName="x"
android:valueFrom="0"
android:valueTo="1000"
android:valueType="floatType" />
我的交易看起来像这样:
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.setCustomAnimations(R.anim.in_from_left, R.anim.in_from_right, R.anim.in_from_left, R.anim.in_from_right);
transaction.add(R.id.container,myFragment,"tag");
transaction.commit();