12

私は Android 5.0 の新しい API をいじり回しており、 Activity transitionViewGroup中に a とその子の 1 つを共有要素として別々にアニメーション化できるかどうかを調べようとしています。

以下のスクリーンショットは、私が達成しようとしていることの簡単な例を示しています。

最初のアクティビティの初期位置 第二の活動の最終順位

最初のアクティビティでは、濃い灰色のボックスがViewGroup画面の中央に配置され、赤いボックスがその子Viewです (使用しているレイアウト XML コードはここにあります)。ユーザーがダーク グレーのボックスをクリックすると、ダーク グレーのボックスが徐々に拡大され、2 番目のアクティビティの背景がいっぱいになります。同時に、赤いボックスは徐々にスケーリングされ、2 番目のアクティビティの左上隅に再配置されます。

アクティビティとアニメーション コード

Activity移行を実行するために使用しているコードは単純です。

/** FirstActivity.java */
public class FirstActivity extends Activity implements View.OnClickListener {
    private View mOuterBox, mInnerBox;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        getWindow().requestFeature(Window.FEATURE_ACTIVITY_TRANSITIONS);
        getWindow().setSharedElementExitTransition(new ChangeBounds());
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_first);
        mOuterBox = findViewById(R.id.outer_box);
        mInnerBox = findViewById(R.id.inner_box);
        mOuterBox.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        Pair<View, String> outerBox = Pair.create(mOuterBox, mOuterBox.getTransitionName());
        Pair<View, String> innerBox = Pair.create(mInnerBox, mInnerBox.getTransitionName());
        Bundle bundle = ActivityOptions.makeSceneTransitionAnimation(this, outerBox, innerBox).toBundle();
        startActivity(new Intent(this, SecondActivity.class), bundle);
    }
}

/** SecondActivity.java */
public class SecondActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        getWindow().requestFeature(Window.FEATURE_ACTIVITY_TRANSITIONS);
        getWindow().setSharedElementEnterTransition(new ChangeBounds());
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
    }
}

問題

最初のアクティビティの濃い灰色のボックスをクリックすると、共有要素の遷移が開始され、濃い灰色のボックスが適切に拡大されて 2 番目のアクティビティの背景が塗りつぶされます。ただし、赤いボックスはまったくアニメーションしていないように見えます。トランジションが開始されるとすぐに、灰色のボックスのアニメーションが終了する前に、赤いボックスのサイズが突然変更され、2 番目のアクティビティ内の最終的な位置に配置されます。

私の質問

遷移ViewGroupの共有要素として、子ビューの 1 つ/一部/すべてを個別にアニメーション化することは可能ですか? Activityもしそうなら、私は何を間違っていますか?また、子ビューも確実にアニメーション化するにはどうすればよいですか?

このサンプル プロジェクトの完全なソース コードはGitHubで入手でき、実行可能な APK はここからダウンロードできます(APK を実行するには、Android 5.0 を実行する物理デバイスまたはエミュレータが必要です)。

4

1 に答える 1

6

はい、グループとその内容を個別に移行できます。しかし、L MR1 で修正されるバグを見つけました。

これは L では十分にサポートされていないようです。2 番目のアクティビティで共有要素を兄弟にすることをお勧めします。

<FrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <View
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/dark_gray"
        android:transitionName="outer_box"/>

    <RelativeLayout
        android:id="@+id/outer_box"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <View
            android:id="@+id/inner_box"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_marginLeft="50dp"
            android:layout_marginTop="50dp"
            android:background="@color/red"
            android:transitionName="inner_box" />
    </RelativeLayout>
</FrameLayout>
于 2014-10-21T23:10:00.600 に答える