130

TL;DR: 「Gmail の 3 つのフラグメント アニメーション」シナリオと呼ぶ、完全に機能するサンプルを探しています。具体的には、次のように 2 つのフラグメントから始めたいと考えています。

2 つの断片

UI イベント (フラグメント B の何かをタップするなど) では、次のことが必要です。

  • 画面から左にスライドするフラグメント A
  • フラグメント B が画面の左端にスライドし、縮小してフラグメント A が空いた場所を占める
  • フラグメント C が画面の右側からスライドインし、フラグメント B によって空いた場所を占める

そして、BACK ボタンを押すと、一連の操作が逆になります。

さて、私は多くの部分的な実装を見てきました。以下の4つをレビューします。不完全であることを超えて、それらはすべて問題を抱えています。


@Reto Meier は、この一般的な回答を同じ基本的な質問に提供setCustomAnimations()し、FragmentTransaction. 2 つのフラグメントのシナリオ (たとえば、最初はフラグメント A しか表示されず、アニメーション効果を使用して新しいフラグメント B に置き換えたい) については、私は完全に同意します。でも:

  • 「イン」アニメーションと「アウト」アニメーションは 1 つしか指定できないため、3 つのフラグメントのシナリオに必要なすべての異なるアニメーションをどのように処理するかわかりません。
  • <objectAnimator>彼のサンプル コードでは、ハードワイヤードの位置をピクセル単位で使用しています。さまざまな画面サイズを考えると、これは実用的ではないように見えますが、アニメーションsetCustomAnimations()リソースが必要であり、これらを Java で定義する可能性を排除しています。
  • スケールのオブジェクトアニメーターが、パーセンテージベースでスペースを割り当てるためのようandroid:layout_weightなものとどのように結びつくかについて途方に暮れていますLinearLayout
  • Fragment Cが最初にどのように処理されるかについて途方に暮れています(GONE? android:layout_weightof 0? スケール0に事前にアニメーション化されていますか?何か他のものですか?)

@Roman Nurikは、自分で定義したものを含め、任意のプロパティをアニメーション化できると指摘しています。これは、独自のカスタム レイアウト マネージャー サブクラスを発明することを犠牲にして、ハードワイヤードの位置の問題を解決するのに役立ちます。それはいくつかの助けになりますが、私はまだRetoのソリューションの残りの部分に困惑しています.


このペーストビン エントリの作成者は、いくつかの興味をそそる疑似コードを示しています。基本的には、3 つのフラグメントすべてが最初はコンテナに存在し、最初はhide()トランザクション操作によってフラグメント C が隠されていると述べています。次に、UI イベントが発生したときにshow()C とA を実行します。hide()ただし、 B のサイズが変化するという事実をどのように処理するかはわかりません。また、明らかに複数のフラグメントを同じコンテナーに追加できるという事実にも依存しており、それが長期的に信頼できる動作であるかどうかはわかりません (言うまでもなく、壊れる必要がfindFragmentById()ありますが、私はそれを受け入れることができます)。


このブログ投稿の著者は、Gmail がオブジェクト アニメーターをまったく使用setCustomAnimations()しておらず、代わりに直接オブジェクト アニメーターを使用していることを示しています (「ルート ビューの左マージンを変更し、右ビューの幅を変更するだけです」)。ただし、これはまだ 2 フラグメント ソリューション AFAICT であり、示されている実装では、ピクセル単位で寸法が固定されています。


私はこれに取り組み続けますので、いつか自分で答えることになるかもしれませんが、誰かがこのアニメーション シナリオの 3 つのフラグメント ソリューションを考え出し、コード (またはリンク) を投稿できることを本当に望んでいます。Android のアニメーションを見ると髪を伸ばしたくなるのですが、私を見たことがある人は、これがほとんど実りのない試みであることを知っています。

4

6 に答える 6

67

私の提案をgithubにアップロードしました (すべての Android バージョンで動作していますが、この種のアニメーションにはハードウェア アクセラレーションを表示することを強くお勧めします。ハードウェア アクセラレーションされていないデバイスの場合は、ビットマップ キャッシュの実装がより適しているはずです)。

アニメーション付きのデモ動画はこちら(フレームレートが遅いのは画面キャストのせいです。実際のパフォーマンスは非常に高速です)


使用法:

layout = new ThreeLayout(this, 3);
layout.setAnimationDuration(1000);
setContentView(layout);
layout.getLeftView();   //<---inflate FragmentA here
layout.getMiddleView(); //<---inflate FragmentB here
layout.getRightView();  //<---inflate FragmentC here

//Left Animation set
layout.startLeftAnimation();

//Right Animation set
layout.startRightAnimation();

//You can even set interpolators

説明

新しいカスタムRelativeLayout(ThreeLayout)と 2 つのカスタム アニメーション (MyScalAnimation、MyTranslateAnimation) を作成しました。

ThreeLayout左ペインの重みを param として取得します。他の可視ビューに があると仮定しますweight=1

そのため、3つの子new ThreeLayout(context,3)を持つ新しいビューを作成し、左側のペインに全画面の 1/3 を割り当てます。もう一方のビューは、使用可能なすべてのスペースを占有します。

実行時に幅を計算します。より安全な実装は、draw() で最初に寸法を計算することです。post() の代わりに

スケーリングと移動のアニメーションは、疑似 [scale,move] ではなく、実際にビューのサイズを変更して移動します。fillAfter(true)どこにも使用されていないことに注意してください。

View2 は View1 の right_of です

View3 は View2 の right_of です

これらのルールを設定すると、RelativeLayout が他のすべてを処理します。アニメーションはmargins(移動時) と[width,height]スケールを変更します

各子にアクセスするには(フラグメントで膨らませることができるように、呼び出すことができます

public FrameLayout getLeftLayout() {}

public FrameLayout getMiddleLayout() {}

public FrameLayout getRightLayout() {}

以下に、2 つのアニメーションを示します。


ステージ1

---IN画面----------!-----OUT----

[View1][_____View2_____][_____View3_____]

ステージ2

--OUT-!--------IN画面------

[View1][View2][_____View3_____]

于 2012-09-07T00:38:30.787 に答える
31

OK、質問のコメントでの@Christopherの提案に従って、Email AOSPアプリから派生した私自身のソリューションを次に示します。

https://github.com/commonsguy/cw-omnibus/tree/master/Animation/ThreePane

@weakwire のソリューションは私のものを連想させますが、彼はAnimationアニメーターではなくクラシックを使用し、RelativeLayoutルールを使用してポジショニングを強制します。報奨金の観点からは、他の誰かがより洗練されたソリューションをまだ回答していない限り、彼はおそらく報奨金を受け取るでしょう.


一言で言えば、ThreePaneLayoutそのプロジェクトの はLinearLayoutサブクラスであり、3 つの子を持つランドスケープで動作するように設計されています。これらの子の幅は、任意の方法でレイアウト XML に設定できます。ここでは重みを使用して示していますが、ディメンション リソースなどによって特定の幅を設定することもできます。3 番目の子 (問題の Fragment C) の幅は 0 にする必要があります。

package com.commonsware.android.anim.threepane;

import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.LinearLayout;

public class ThreePaneLayout extends LinearLayout {
  private static final int ANIM_DURATION=500;
  private View left=null;
  private View middle=null;
  private View right=null;
  private int leftWidth=-1;
  private int middleWidthNormal=-1;

  public ThreePaneLayout(Context context, AttributeSet attrs) {
    super(context, attrs);
    initSelf();
  }

  void initSelf() {
    setOrientation(HORIZONTAL);
  }

  @Override
  public void onFinishInflate() {
    super.onFinishInflate();

    left=getChildAt(0);
    middle=getChildAt(1);
    right=getChildAt(2);
  }

  public View getLeftView() {
    return(left);
  }

  public View getMiddleView() {
    return(middle);
  }

  public View getRightView() {
    return(right);
  }

  public void hideLeft() {
    if (leftWidth == -1) {
      leftWidth=left.getWidth();
      middleWidthNormal=middle.getWidth();
      resetWidget(left, leftWidth);
      resetWidget(middle, middleWidthNormal);
      resetWidget(right, middleWidthNormal);
      requestLayout();
    }

    translateWidgets(-1 * leftWidth, left, middle, right);

    ObjectAnimator.ofInt(this, "middleWidth", middleWidthNormal,
                         leftWidth).setDuration(ANIM_DURATION).start();
  }

  public void showLeft() {
    translateWidgets(leftWidth, left, middle, right);

    ObjectAnimator.ofInt(this, "middleWidth", leftWidth,
                         middleWidthNormal).setDuration(ANIM_DURATION)
                  .start();
  }

  public void setMiddleWidth(int value) {
    middle.getLayoutParams().width=value;
    requestLayout();
  }

  private void translateWidgets(int deltaX, View... views) {
    for (final View v : views) {
      v.setLayerType(View.LAYER_TYPE_HARDWARE, null);

      v.animate().translationXBy(deltaX).setDuration(ANIM_DURATION)
       .setListener(new AnimatorListenerAdapter() {
         @Override
         public void onAnimationEnd(Animator animation) {
           v.setLayerType(View.LAYER_TYPE_NONE, null);
         }
       });
    }
  }

  private void resetWidget(View v, int width) {
    LinearLayout.LayoutParams p=
        (LinearLayout.LayoutParams)v.getLayoutParams();

    p.width=width;
    p.weight=0;
  }
}

ただし、実行時に、最初に幅をどのように設定したとしても、フラグメント A および B と呼ばれる質問の表示からフラグメント B および C への切り替えThreePaneLayoutに初めて使用するときに、幅の管理が引き継がれます。 -- フラグメントとの特定の関係はありません -- 3 つの部分は、、およびです。を呼び出した時点で、 とのサイズを記録し、3 つのうちのいずれかで使用された重みをゼロにするので、サイズを完全に制御できます。の時点で、 のサイズをの元のサイズに設定します。hideLeft()ThreePaneLayoutleftmiddlerighthideLeft()leftmiddlehideLeft()rightmiddle

アニメーションには次の 2 つがあります。

  • a を使用して、ハードウェア レイヤーを使用してViewPropertyAnimator、 の幅で 3 つのウィジェットを左に移動します。left
  • ObjectAnimatorのカスタム疑似プロパティでを使用して、開始時の幅を の元の幅にmiddleWidth変更します。middleleft

(これらすべてにAnimatorSetandを使用する方が良い考えである可能性がありますが、これは今のところ機能します)ObjectAnimators

middleWidth ObjectAnimator(かなり継続的な無効化が必要なため、ハードウェア層の値を無効にすることも可能です)

(アニメーションの理解にまだギャップがあり、括弧内のステートメントが好きな可能性は間違いなくあります)

最終的な効果はleft、画面からmiddle滑り落ち、 の元の位置とサイズにスライドし、 のすぐ後ろに移動することleftです。rightmiddle

showLeft()方向を逆にしただけで、同じアニメーターの組み合わせで、プロセスを逆にするだけです。

アクティビティは を使用して、ウィジェットThreePaneLayoutのペアと を保持します。左のフラグメントで何かを選択すると、中央のフラグメントが追加 (または内容が更新) されます。中央のフラグメントで何かを選択すると、 のキャプションが設定され、さらに が実行されます。左側を非表示にした場合、BACK を押すと実行されます。それ以外の場合、BACK はアクティビティを終了します。これはアニメーションに影響を与えるために使用されないため、その「バック スタック」を自分で管理することになります。ListFragmentButtonButtonhideLeft()ThreePaneLayoutshowLeft()FragmentTransactions

上記のリンク先のプロジェクトは、ネイティブ フラグメントとネイティブ アニメーター フレームワークを使用しています。アニメーションに Android サポート フラグメント バックポートとNineOldAndroidsを使用する同じプロジェクトの別のバージョンがあります。

https://github.com/commonsguy/cw-omnibus/tree/master/Animation/ThreePaneBC

バックポートは第 1 世代の Kindle Fire で問題なく動作しますが、ハードウェアの仕様が低く、ハードウェア アクセラレーションがサポートされていないため、アニメーションは少しぎくしゃくしています。どちらの実装も、Nexus 7 やその他の現世代のタブレットではスムーズに見えます。

私は確かに、このソリューションを改善する方法、またはここで行ったこと (または @weakwire を使用したこと) よりも明確な利点を提供する他のソリューションのアイデアに対してオープンです。

貢献してくれたすべての人にもう一度感謝します!

于 2012-09-07T12:45:52.943 に答える
13

この問題を解決する PanesLibrary というライブラリを構築しました。以下の理由により、以前に提供されていたものよりもさらに柔軟です。

  • 各ペインは動的にサイズ変更できます
  • 任意の数のペインを使用できます (2 つまたは 3 つだけではありません)。
  • ペイン内のフラグメントは、向きが変わっても正しく保持されます。

ここで確認できます: https://github.com/Mapsaurus/Android-PanesLibrary

デモはこちら: http://www.youtube.com/watch?v=UA-lAGVXoLU&feature=youtu.be

基本的に、動的サイズのペインをいくつでも簡単に追加し、それらのペインにフラグメントを添付できます。お役に立てば幸いです。:)

于 2013-02-19T16:51:07.507 に答える
6

リンクした例の 1 つ ( http://android.amberfog.com/?p=758layout_weight ) を構築して、プロパティをアニメーション化するのはどうですか? このようにして、3 つの破片の重量の変化を一緒にアニメートすることができます。

シンプルなレイアウトから始めましょう。をアニメーション化するので、3 つのパネルのルート ビューとして がlayout_weight必要です。LinearLayout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">

<LinearLayout
    android:id="@+id/panel1"
    android:layout_width="0dip"
    android:layout_weight="1"
    android:layout_height="match_parent"/>

<LinearLayout
    android:id="@+id/panel2"
    android:layout_width="0dip"
    android:layout_weight="2"
    android:layout_height="match_parent"/>

<LinearLayout
    android:id="@+id/panel3"
    android:layout_width="0dip"
    android:layout_weight="0"
    android:layout_height="match_parent"/>
</LinearLayout>

次に、デモクラス:

public class DemoActivity extends Activity implements View.OnClickListener {
    public static final int ANIM_DURATION = 500;
    private static final Interpolator interpolator = new DecelerateInterpolator();

    boolean isCollapsed = false;

    private Fragment frag1, frag2, frag3;
    private ViewGroup panel1, panel2, panel3;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        panel1 = (ViewGroup) findViewById(R.id.panel1);
        panel2 = (ViewGroup) findViewById(R.id.panel2);
        panel3 = (ViewGroup) findViewById(R.id.panel3);

        frag1 = new ColorFrag(Color.BLUE);
        frag2 = new InfoFrag();
        frag3 = new ColorFrag(Color.RED);

        final FragmentManager fm = getFragmentManager();
        final FragmentTransaction trans = fm.beginTransaction();

        trans.replace(R.id.panel1, frag1);
        trans.replace(R.id.panel2, frag2);
        trans.replace(R.id.panel3, frag3);

        trans.commit();
    }

    @Override
    public void onClick(View view) {
        toggleCollapseState();
    }

    private void toggleCollapseState() {
        //Most of the magic here can be attributed to: http://android.amberfog.com/?p=758

        if (isCollapsed) {
            PropertyValuesHolder[] arrayOfPropertyValuesHolder = new PropertyValuesHolder[3];
            arrayOfPropertyValuesHolder[0] = PropertyValuesHolder.ofFloat("Panel1Weight", 0.0f, 1.0f);
            arrayOfPropertyValuesHolder[1] = PropertyValuesHolder.ofFloat("Panel2Weight", 1.0f, 2.0f);
            arrayOfPropertyValuesHolder[2] = PropertyValuesHolder.ofFloat("Panel3Weight", 2.0f, 0.0f);
            ObjectAnimator localObjectAnimator = ObjectAnimator.ofPropertyValuesHolder(this, arrayOfPropertyValuesHolder).setDuration(ANIM_DURATION);
            localObjectAnimator.setInterpolator(interpolator);
            localObjectAnimator.start();
        } else {
            PropertyValuesHolder[] arrayOfPropertyValuesHolder = new PropertyValuesHolder[3];
            arrayOfPropertyValuesHolder[0] = PropertyValuesHolder.ofFloat("Panel1Weight", 1.0f, 0.0f);
            arrayOfPropertyValuesHolder[1] = PropertyValuesHolder.ofFloat("Panel2Weight", 2.0f, 1.0f);
            arrayOfPropertyValuesHolder[2] = PropertyValuesHolder.ofFloat("Panel3Weight", 0.0f, 2.0f);
            ObjectAnimator localObjectAnimator = ObjectAnimator.ofPropertyValuesHolder(this, arrayOfPropertyValuesHolder).setDuration(ANIM_DURATION);
            localObjectAnimator.setInterpolator(interpolator);
            localObjectAnimator.start();
        }
        isCollapsed = !isCollapsed;
    }

    @Override
    public void onBackPressed() {
        //TODO: Very basic stack handling. Would probably want to do something relating to fragments here..
        if(isCollapsed) {
            toggleCollapseState();
        } else {
            super.onBackPressed();
        }
    }

    /*
     * Our magic getters/setters below!
     */

    public float getPanel1Weight() {
        LinearLayout.LayoutParams params = (LinearLayout.LayoutParams)     panel1.getLayoutParams();
        return params.weight;
    }

    public void setPanel1Weight(float newWeight) {
        LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) panel1.getLayoutParams();
        params.weight = newWeight;
        panel1.setLayoutParams(params);
    }

    public float getPanel2Weight() {
        LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) panel2.getLayoutParams();
        return params.weight;
    }

    public void setPanel2Weight(float newWeight) {
        LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) panel2.getLayoutParams();
        params.weight = newWeight;
        panel2.setLayoutParams(params);
    }

    public float getPanel3Weight() {
        LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) panel3.getLayoutParams();
        return params.weight;
    }

    public void setPanel3Weight(float newWeight) {
        LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) panel3.getLayoutParams();
        params.weight = newWeight;
        panel3.setLayoutParams(params);
    }


    /**
     * Crappy fragment which displays a toggle button
     */
    public static class InfoFrag extends Fragment {
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle     savedInstanceState) {
            LinearLayout layout = new LinearLayout(getActivity());
            layout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
            layout.setBackgroundColor(Color.DKGRAY);

            Button b = new Button(getActivity());
            b.setOnClickListener((DemoActivity) getActivity());
            b.setText("Toggle Me!");

            layout.addView(b);

            return layout;
        }
    }

    /**
     * Crappy fragment which just fills the screen with a color
     */
    public static class ColorFrag extends Fragment {
        private int mColor;

        public ColorFrag() {
            mColor = Color.BLUE; //Default
        }

        public ColorFrag(int color) {
            mColor = color;
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            FrameLayout layout = new FrameLayout(getActivity());
            layout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));

            layout.setBackgroundColor(mColor);
            return layout;
        }
    }
}

また、この例では FragmentTransactions を使用してアニメーションを実現していません (むしろ、フラグメントがアタッチされているビューをアニメーション化します)。そのため、すべてのバックスタック/フラグメント トランザクションを自分で行う必要がありますが、アニメーションを機能させる労力と比較すると、まあ、これは悪いトレードオフのようには見えません:)

動作中の恐ろしい低解像度ビデオ: http://youtu.be/Zm517j3bFCo

于 2012-09-06T15:44:01.687 に答える
5

これはフラグメントを使用していません...これは3つの子を持つカスタムレイアウトです。offsetLeftAndRight()メッセージをクリックすると、アニメーターを使用して3人の子をオフセットします。

ではJellyBean、[開発者向けオプション]設定で[レイアウト境界の表示]を有効にできます。スライドアニメーションが完了しても、左側のメニューはまだそこにありますが、中央のパネルの下にあることがわかります。

Cyril Mottierのフライインアプリメニューに似ていますが、2つではなく3つの要素があります。

さらに、ViewPager3番目の子のは、この動作の別の指標です。ViewPager通常、フラグメントを使用します(必要はないことはわかっていますが、それ以外の実装は見たことがありません)。また、別の子の内部でFragmentは使用できないため、3つの子おそらくフラグメントではありません...FragmentsFragment

于 2012-09-06T15:26:52.787 に答える
2

私は現在、フラグメント B のスケールが利用可能なスペースを確保し、十分なスペースがあれば 3 つのペインを同時に開くことができることを除いて、そのようなことをしようとしています。これまでの私の解決策は次のとおりですが、それに固執するかどうかはわかりません。誰かが正しい方法を示す答えを提供してくれることを願っています。

LinearLayout を使用してウェイトをアニメーション化する代わりに、RelativeLayout を使用して余白をアニメーション化します。更新のたびに requestLayout() を呼び出す必要があるため、これが最善の方法かどうかはわかりません。ただし、すべてのデバイスでスムーズです。

だから、私はレイアウトをアニメーション化します。私はフラグメントトランザクションを使用していません。戻るボタンを手動で処理して、フラグメント C が開いている場合は閉じます。

FragmentB は、layout_toLeftOf/ToRightOf を使用して、フラグメント A と C に合わせて配置します。

アプリがフラグメント C を表示するイベントをトリガーすると、フラグメント C をスライドインし、同時にフラグメント A をスライドアウトします。(2 つの個別のアニメーション)。逆に、フラグメントAが開くと、同時にCを閉じます。

縦向きモードまたは小さい画面では、少し異なるレイアウトを使用して、画面上で Fragment C をスライドさせます。

フラグメント A と C の幅にパーセンテージを使用するには、実行時に計算する必要があると思います... (?)

アクティビティのレイアウトは次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/rootpane"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <!-- FRAGMENT A -->
    <fragment
        android:id="@+id/fragment_A"
        android:layout_width="300dp"
        android:layout_height="fill_parent"
        class="com.xyz.fragA" />

    <!-- FRAGMENT C -->
    <fragment
        android:id="@+id/fragment_C"
        android:layout_width="600dp"
        android:layout_height="match_parent"
        android:layout_alignParentRight="true"
        class="com.xyz.fragC"/>

    <!-- FRAGMENT B -->
    <fragment
        android:id="@+id/fragment_B"
        android:layout_width="match_parent"
        android:layout_height="fill_parent"
        android:layout_marginLeft="0dip"
        android:layout_marginRight="0dip"
        android:layout_toLeftOf="@id/fragment_C"
        android:layout_toRightOf="@id/fragment_A"
        class="com.xyz.fragB" />

</RelativeLayout>

FragmentC をスライドインまたはスライドアウトするアニメーション:

private ValueAnimator createFragmentCAnimation(final View fragmentCRootView, boolean slideIn) {

    ValueAnimator anim = null;

    final RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) fragmentCRootView.getLayoutParams();
    if (slideIn) {
        // set the rightMargin so the view is just outside the right edge of the screen.
        lp.rightMargin = -(lp.width);
        // the view's visibility was GONE, make it VISIBLE
        fragmentCRootView.setVisibility(View.VISIBLE);
        anim = ValueAnimator.ofInt(lp.rightMargin, 0);
    } else
        // slide out: animate rightMargin until the view is outside the screen
        anim = ValueAnimator.ofInt(0, -(lp.width));

    anim.setInterpolator(new DecelerateInterpolator(5));
    anim.setDuration(300);
    anim.addUpdateListener(new AnimatorUpdateListener() {

        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            Integer rightMargin = (Integer) animation.getAnimatedValue();
            lp.rightMargin = rightMargin;
            fragmentCRootView.requestLayout();
        }
    });

    if (!slideIn) {
        // if the view was sliding out, set visibility to GONE once the animation is done
        anim.addListener(new AnimatorListenerAdapter() {

            @Override
            public void onAnimationEnd(Animator animation) {
                fragmentCRootView.setVisibility(View.GONE);
            }
        });
    }
    return anim;
}
于 2012-09-06T19:25:47.963 に答える