私は 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 を実行する物理デバイスまたはエミュレータが必要です)。