2 つのアクティビティ間の遷移を定義したいと思います。私の目標は、アクティビティ間で画像と 2 つのテキストを共有することですが、テキストのアークモーションを定義したい (そして画像の changeBounds を保持したい)。
私は次のようにスタイルを設定しました:
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="android:windowActivityTransitions">true</item>
<item name="android:windowContentTransitions">true</item>
<item name="android:windowSharedElementsUseOverlay">false</item>
<item name="android:windowAllowEnterTransitionOverlap">true</item>
<item name="android:windowAllowReturnTransitionOverlap">true</item>
</style>
<style name="AppTheme.DetailActivity" parent="AppTheme">
<item name="android:windowExitTransition">@transition/detail_exit</item>
<item name="android:windowEnterTransition">@transition/detail_enter</item>
<item name="android:windowSharedElementEnterTransition">@transition/detail_shared_enter</item>
<item name="android:windowSharedElementExitTransition">@transition/detail_shared_exit</item>
</style>
次のように DetailActivity を開始します。
ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(MainActivity.this,
Pair.create(findViewById(R.id.image), "image"),
Pair.create(findViewById(R.id.text), "text"));
Intent intent = new Intent(MainActivity.this, DetailActivity.class);
startActivity(intent, options.toBundle());
問題は、この detail_shared_enter がアニメーションに適用されないことです:
<?xml version="1.0" encoding="utf-8"?>
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="@android:integer/config_mediumAnimTime">
<arcMotion android:minimumHorizontalAngle="45"
android:minimumVerticalAngle="45">
<targets>
<target android:targetId="@id/image2"/>
</targets>
</arcMotion>
<autoTransition>
<targets>
<target android:excludeId="@id/image2"/>
</targets>
</autoTransition>
</transitionSet>
これにより、共有要素はアニメーションなしで最終的な位置に表示されます。windowEnterTransition が機能します。
事前に助けてくれてありがとう!
更新: このチュートリアルに基づいて解決策を見つけました: https://blog.stylingandroid.com/curved-motion-part-1/
解決策は次のとおりです。
<?xml version="1.0" encoding="utf-8"?>
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"
android:transitionOrdering="together">
<changeBounds>
<targets>
<target android:excludeId="@id/image2"/>
</targets>
</changeBounds>
<changeBounds>
<targets>
<target android:targetId="@id/image2"/>
</targets>
<arcMotion android:maximumAngle="90"
android:minimumHorizontalAngle="90"
android:minimumVerticalAngle="0"/>
</changeBounds>
</transitionSet>
- 後で定義するものを除くアニメーションを定義する必要があります。
- changeBounds の内側に arcMotion を配置します。
- 最も重要なこと: 「arcMotion はここでは許可されていません」という弱い警告を無視してください!