共享元素没有正常工作(奇怪的行为)
Shared Elements is not working as it should (strange behavior)
显然我正在正确执行所有步骤,但转换工作不正常。
我打开了一个非常简单的新项目,只有两个活动,在 MainActivity 布局中我有一个居中的 ImageView,在 SecondActivity 中我有相同的 ImageView,但更大
发生以下情况:
当我打开应用程序并单击图像时,它打开了 SecondActivity 但没有转换,现在仍在 SecondActivity 中,当我按下后退按钮时,它返回到 MainActivity,但仍然没有转换。从现在开始,当我点击 ImageView 时,SecondActivity 不再打开,但是,当我最小化应用程序(通过 onPause 时)并返回时,SecondActivity 打开,当我按下后退按钮时,“反向转换 " 正确发生。
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<ImageView
android:id="@+id/menu_image_view"
android:layout_width="200dp"
android:layout_height="300dp"
android:clickable="true"
android:focusable="true"
android:scaleType="centerCrop"
android:src="@drawable/cardapio"
android:transitionName="image"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
MainActivity.kt
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val menuImageView = findViewById<ImageView>(R.id.menu_image_view)
menuImageView.transitionName = "image"
val i = Intent(this, SecondActivity::class.java)
val options: Bundle? = ActivityOptionsCompat.makeSceneTransitionAnimation(
this, menuImageView, "image"
).toBundle()
menuImageView.setOnClickListener {
startActivity(i, options)
}
}
}
activity_second.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".SecondActivity">
<ImageView
android:layout_width="400dp"
android:layout_height="600dp"
android:scaleType="centerCrop"
android:src="@drawable/cardapio"
android:transitionName="image"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
SecondActivity.kt
class SecondActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_second)
}
override fun onBackPressed() {
// To support reverse transitions when user clicks the device back button
supportFinishAfterTransition()
}
}
还有我的themes.xml:
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.Animations" parent="Theme.MaterialComponents.DayNight.NoActionBar">
<!-- Primary brand color. -->
<item name="colorPrimary">@color/purple_500</item>
<item name="colorPrimaryVariant">@color/purple_700</item>
<item name="colorOnPrimary">@color/white</item>
<!-- Secondary brand color. -->
<item name="colorSecondary">@color/teal_200</item>
<item name="colorSecondaryVariant">@color/teal_700</item>
<item name="colorOnSecondary">@color/black</item>
<!-- Status bar color. -->
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
<!-- Customize your theme here. -->
<item name="android:windowActivityTransitions">true</item>
</style>
</resources>
我已经尝试过同时使用
<item name="android:windowActivityTransitions">true</item>
和
<item name="android:windowContentTransitions">true</item>
会不会是 Android Studio 错误?
你必须把它们放在里面 onClickListener
。如果你把 onCreate
放在里面,它会在 activity 创建后创建它。当您最小化应用程序时,只会触发 onPaused
。
menuImageView.setOnClickListener {
val i = Intent(this, SecondActivity::class.java)
val options: Bundle? = ActivityOptionsCompat.makeSceneTransitionAnimation(
this, menuImageView, "image"
).toBundle()
startActivity(i, options)
}
显然我正在正确执行所有步骤,但转换工作不正常。
我打开了一个非常简单的新项目,只有两个活动,在 MainActivity 布局中我有一个居中的 ImageView,在 SecondActivity 中我有相同的 ImageView,但更大
发生以下情况:
当我打开应用程序并单击图像时,它打开了 SecondActivity 但没有转换,现在仍在 SecondActivity 中,当我按下后退按钮时,它返回到 MainActivity,但仍然没有转换。从现在开始,当我点击 ImageView 时,SecondActivity 不再打开,但是,当我最小化应用程序(通过 onPause 时)并返回时,SecondActivity 打开,当我按下后退按钮时,“反向转换 " 正确发生。
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<ImageView
android:id="@+id/menu_image_view"
android:layout_width="200dp"
android:layout_height="300dp"
android:clickable="true"
android:focusable="true"
android:scaleType="centerCrop"
android:src="@drawable/cardapio"
android:transitionName="image"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
MainActivity.kt
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val menuImageView = findViewById<ImageView>(R.id.menu_image_view)
menuImageView.transitionName = "image"
val i = Intent(this, SecondActivity::class.java)
val options: Bundle? = ActivityOptionsCompat.makeSceneTransitionAnimation(
this, menuImageView, "image"
).toBundle()
menuImageView.setOnClickListener {
startActivity(i, options)
}
}
}
activity_second.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".SecondActivity">
<ImageView
android:layout_width="400dp"
android:layout_height="600dp"
android:scaleType="centerCrop"
android:src="@drawable/cardapio"
android:transitionName="image"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
SecondActivity.kt
class SecondActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_second)
}
override fun onBackPressed() {
// To support reverse transitions when user clicks the device back button
supportFinishAfterTransition()
}
}
还有我的themes.xml:
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.Animations" parent="Theme.MaterialComponents.DayNight.NoActionBar">
<!-- Primary brand color. -->
<item name="colorPrimary">@color/purple_500</item>
<item name="colorPrimaryVariant">@color/purple_700</item>
<item name="colorOnPrimary">@color/white</item>
<!-- Secondary brand color. -->
<item name="colorSecondary">@color/teal_200</item>
<item name="colorSecondaryVariant">@color/teal_700</item>
<item name="colorOnSecondary">@color/black</item>
<!-- Status bar color. -->
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
<!-- Customize your theme here. -->
<item name="android:windowActivityTransitions">true</item>
</style>
</resources>
我已经尝试过同时使用
<item name="android:windowActivityTransitions">true</item>
和
<item name="android:windowContentTransitions">true</item>
会不会是 Android Studio 错误?
你必须把它们放在里面 onClickListener
。如果你把 onCreate
放在里面,它会在 activity 创建后创建它。当您最小化应用程序时,只会触发 onPaused
。
menuImageView.setOnClickListener {
val i = Intent(this, SecondActivity::class.java)
val options: Bundle? = ActivityOptionsCompat.makeSceneTransitionAnimation(
this, menuImageView, "image"
).toBundle()
startActivity(i, options)
}