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 に答える