Android Lollipop の新しい Activity Transitions を使いたいです。しかし、現在、アニメーション中に非常に奇妙なヒックアップが見られます。考えられる最小のサンプルをハッキングしました。
これは私が非常に短いバージョンで行ったことです:
- 私のウィンドウコンテンツの遷移を有効にしました
styles.xml
- 私のスタイルでは非常に単純な
slide.xml
終了トランジションを参照しました android:transitionName
両方のレイアウトで共有要素に を提供ActivityOptions.makeSceneTransitionAnimation()
その名前と共有したいビューで呼び出されます- 結果のバンドルをに渡しました
startActivity()
これが私が見た動作です (アニメーションの速度を 10 倍遅くしてみてください)。スライド アニメーションが共有されていないビューを下にスライドする直前に、それらのビューが少し下にジャンプします。彼らは実際には少し離れて移動します。
しかし:これは、そのアニメーションを2回目に実行したときにのみ発生します(その後は毎回)。最初のパスは問題ないようです。また、これは要素を次のアクティビティと共有したい場合にのみ発生します。要素を共有しようとしなければ、すべてうまくいきます。
これが私のコードです:
値/styles.xml
<resources>
<style name="AppTheme" parent="android:Theme.Material.Light">
<!-- enable window content transitions -->
<item name="android:windowContentTransitions">true</item>
<!-- specify exit transition -->
<item name="android:windowExitTransition">@transition/slide</item>
</style>
</resources>
transition/slide.xml
<slide />
メインアクティビティのレイアウト
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<View
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:background="#0000ff" />
<View
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:background="#00ff00" />
<View
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:background="#0000ff" />
<View
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:background="#00ff00" />
</LinearLayout>
<!-- the actual element I want to share -->
<View
android:id="@+id/view"
android:layout_width="56dp"
android:layout_height="56dp"
android:background="#ff0000"
android:elevation="8dp"
android:transitionName="view" />
</RelativeLayout>
MainActivity.java
public class MainActivity extends Activity implements View.OnClickListener {
View mView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mView = findViewById(R.id.view);
mView.setOnClickListener(this);
}
@Override
public void onClick(View view) {
ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this, mView, "view");
Intent intent = new Intent(this, SecondaryActivity.class);
startActivity(intent, options.toBundle());
}
}