6

我正在尝试在 Android 中滑入一个片段。过渡和滑动按预期工作,它准确地滑动到我想要的位置。但是,在视图到位之前,视图将处于其最终位置的位置是白色背景。就好像它已经为它分配了空间。但我希望它滑过我当前的视图,所以不显示白色背景。对此有什么想法吗?我在 res/anim 中使用带有 xml 文件的视图动画器。

这是一个小代码:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

<translate
    android:duration="100"
    android:fromYDelta="100%"
    android:toYDelta="0" />

<alpha
    android:duration="100"
    android:fromAlpha="0.0"
    android:toAlpha="1.0" />

android.support.v4.app.FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();

fragmentTransaction.setCustomAnimations(R.anim.slide_in_down, 0);
fragmentTransaction.show(fragmentToSlideIn);
fragmentTransaction.commit();

那么,为什么视图的最终位置在到达该位置之前会有白色背景?

4

1 回答 1

0

http://developer.android.com/guide/topics/graphics/prop-animation.html#object-animator 你应该使用objectAnimator,这里是从右向左滑动片段的示例代码:

    private View mPanel1;
    private View mPanel2;
    private View mLayout;
    boolean isCollapsed;
    private int LayoutWidth;
    private int Panel1Width;
    private int Panel2Width;
    private static final TimeInterpolator sCollapseInterpolator = new DecelerateInterpolator(2.5F);
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mLayout = findViewById(R.id.linearlayout);
    mPanel1 = findViewById(R.id.fragment1);
    mPanel2 = findViewById(R.id.fragment2);
}
    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
     super.onWindowFocusChanged(hasFocus);
        // Measure width of layout and mPanel1 which is FragmentList. This is needed for ObjectAnimator
        // to create transition animation
        Display display = getWindowManager().getDefaultDisplay();
        Point size = new Point();
        display.getSize(size);
        LayoutWidth = size.x;
        Panel1Width = mPanel1.getWidth();
        Panel2Width = mPanel2.getWidth();

    }
    public void slide(){
        if(isCollapsed){
                        PropertyValuesHolder[] arrayOfPropertyValuesHolder = new PropertyValuesHolder[2];
                        arrayOfPropertyValuesHolder[0] = PropertyValuesHolder.ofInt("PanelLeft", Panel1Width * -1, 0);
                        arrayOfPropertyValuesHolder[1] = PropertyValuesHolder.ofInt("Panel2W", LayoutWidth, LayoutWidth - Panel1Width);
                        ObjectAnimator localObjectAnimator = ObjectAnimator.ofPropertyValuesHolder(this, arrayOfPropertyValuesHolder).setDuration(400);
                        localObjectAnimator.setInterpolator(sCollapseInterpolator);
                        localObjectAnimator.start();
                    }
                    else{
                        PropertyValuesHolder[] arrayOfPropertyValuesHolder = new PropertyValuesHolder[2];
                        arrayOfPropertyValuesHolder[0] = PropertyValuesHolder.ofInt("PanelLeft", 0, Panel1Width / -1);
                        arrayOfPropertyValuesHolder[1] = PropertyValuesHolder.ofInt("Panel2W", LayoutWidth - Panel1Width, LayoutWidth);
                        ObjectAnimator localObjectAnimator = ObjectAnimator.ofPropertyValuesHolder(this, arrayOfPropertyValuesHolder).setDuration(400);
                        localObjectAnimator.setInterpolator(sCollapseInterpolator);
                        localObjectAnimator.start();
                    }
                    isCollapsed = !isCollapsed;
    }

        public int getPanelLeft() {
            return ((ViewGroup.MarginLayoutParams) mLayout.getLayoutParams()).leftMargin;
        }

        public void setPanelLeft(int paramInt) {
             ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) mLayout.getLayoutParams();
             lp.leftMargin = paramInt;
             mLayout.setLayoutParams(lp);
         }

        public int getPanel2W() {
             return ((ViewGroup.MarginLayoutParams) mPanel2.getLayoutParams()).width;
        }

        public void setPanel2W(int paramInt) {
             ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) mPanel2.getLayoutParams();
             lp.width = paramInt;
             mPanel2.setLayoutParams(lp);
        }

布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/linearlayout" >

    <fragment
        android:id="@+id/fragment1"
        android:name="package.your.fragment1"
        android:layout_width="320dp"
        android:layout_height="match_parent"/>

<fragment
        android:id="@+id/fragment2"
        android:name="package.your.fragment2"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</LinearLayout>
于 2013-02-23T21:31:42.387 回答