Android activity 场景转换不同的动画目标
Android activity scene transition different animation target
考虑这个用例:主屏幕有两个按钮,当用户点击"Generate Random Number"按钮时,会生成一个随机数并使用全屏activity来显示该数字。之后生成的随机数显示在"Last Number Generated:"之后。我正在尝试使用 ActivityOptions.makeSceneTransitionAnimation()
添加 activity 过渡动画。因此,当用户单击 "Generate Random Number" 按钮时,全屏 activity 会展开。但是当用户关闭全屏时 activity 我想使用 "Last Number Generated:" 作为动画目标。但是我发现无法使用 ActivityOptions.makeSceneTransitionAnimation() 来做到这一点。当全屏 activity 关闭时,动画目标将始终是开始动画的原始视图。有什么技巧可以实现行为吗?这是源代码:
MainActivity.kt:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
findViewById<TextView>(R.id.generate).setOnClickListener {
startActivity(Intent(this, FullScreenActivity::class.java).apply {
val randomNum = Random().nextInt(100)
putExtra(FullScreenActivity.KEY, randomNum)
findViewById<TextView>(R.id.last_result).text = "Last Number Generated: $randomNum"
}, ActivityOptionsCompat.makeSceneTransitionAnimation(
this, findViewById<TextView>(R.id.generate), "random"
).toBundle())
}
}
}
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/last_result"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="18dp"
android:textSize="18sp"
android:transitionName="random"
android:text="Last Number Generated:"
android:background="@color/colorPrimary"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
<TextView
android:id="@+id/generate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="18dp"
android:textSize="18sp"
android:text="Generate Random Number"
android:transitionName="random"
android:background="@color/colorPrimary"
android:layout_marginTop="20dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/last_result"/>
</android.support.constraint.ConstraintLayout>
FullScreenActivity.kt:
class FullScreenActivity : AppCompatActivity() {
companion object {
const val KEY = "KEY"
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_full_screen)
val randomNumber = intent.getIntExtra(KEY, 0)
findViewById<TextView>(R.id.full_screen).text = randomNumber.toString()
}
}
activity_full_screen.xml:
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/full_screen"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textSize="72sp"
android:gravity="center"
android:transitionName="random"
android:background="@color/colorAccent"/>
您应该将 R.id.generate
和 R.id.last_result
添加到 makeSceneTransitionAnimation
中作为 sharedElements
,但 transitionName
不同。
Pair<View, String> pair1 = new Pair<>(generate, "random");
Pair<View, String> pair2 = new Pair<>(lastResult, "lastResult");
Bundle bundle = ActivityOptionsCompat.
makeSceneTransitionAnimation(MainActivity.this, pair1, pair2)
.toBundle();
startActivity(intent, bundle);
然后在 FullScreenActivity
中,您应该将 R.id.full_screen
的 transitionName
中的某处从 "random"
更改为 "lastResult"
(与 transitionName
相同=13=])。我用 onBackPressed
方法来做:
@Override
public void onBackPressed() {
textView.setTransitionName("lastResult");
super.onBackPressed();
}
结果:
考虑这个用例:主屏幕有两个按钮,当用户点击"Generate Random Number"按钮时,会生成一个随机数并使用全屏activity来显示该数字。之后生成的随机数显示在"Last Number Generated:"之后。我正在尝试使用 ActivityOptions.makeSceneTransitionAnimation()
添加 activity 过渡动画。因此,当用户单击 "Generate Random Number" 按钮时,全屏 activity 会展开。但是当用户关闭全屏时 activity 我想使用 "Last Number Generated:" 作为动画目标。但是我发现无法使用 ActivityOptions.makeSceneTransitionAnimation() 来做到这一点。当全屏 activity 关闭时,动画目标将始终是开始动画的原始视图。有什么技巧可以实现行为吗?这是源代码:
MainActivity.kt:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
findViewById<TextView>(R.id.generate).setOnClickListener {
startActivity(Intent(this, FullScreenActivity::class.java).apply {
val randomNum = Random().nextInt(100)
putExtra(FullScreenActivity.KEY, randomNum)
findViewById<TextView>(R.id.last_result).text = "Last Number Generated: $randomNum"
}, ActivityOptionsCompat.makeSceneTransitionAnimation(
this, findViewById<TextView>(R.id.generate), "random"
).toBundle())
}
}
}
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/last_result"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="18dp"
android:textSize="18sp"
android:transitionName="random"
android:text="Last Number Generated:"
android:background="@color/colorPrimary"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
<TextView
android:id="@+id/generate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="18dp"
android:textSize="18sp"
android:text="Generate Random Number"
android:transitionName="random"
android:background="@color/colorPrimary"
android:layout_marginTop="20dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/last_result"/>
</android.support.constraint.ConstraintLayout>
FullScreenActivity.kt:
class FullScreenActivity : AppCompatActivity() {
companion object {
const val KEY = "KEY"
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_full_screen)
val randomNumber = intent.getIntExtra(KEY, 0)
findViewById<TextView>(R.id.full_screen).text = randomNumber.toString()
}
}
activity_full_screen.xml:
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/full_screen"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textSize="72sp"
android:gravity="center"
android:transitionName="random"
android:background="@color/colorAccent"/>
您应该将 R.id.generate
和 R.id.last_result
添加到 makeSceneTransitionAnimation
中作为 sharedElements
,但 transitionName
不同。
Pair<View, String> pair1 = new Pair<>(generate, "random");
Pair<View, String> pair2 = new Pair<>(lastResult, "lastResult");
Bundle bundle = ActivityOptionsCompat.
makeSceneTransitionAnimation(MainActivity.this, pair1, pair2)
.toBundle();
startActivity(intent, bundle);
然后在 FullScreenActivity
中,您应该将 R.id.full_screen
的 transitionName
中的某处从 "random"
更改为 "lastResult"
(与 transitionName
相同=13=])。我用 onBackPressed
方法来做:
@Override
public void onBackPressed() {
textView.setTransitionName("lastResult");
super.onBackPressed();
}
结果: