Android のアニメーションとトランジション

Android アニメーションとトランジション
(1) アニメーション
JetpackCompose は、アプリケーションの UI にさまざまなアニメーションを簡単に実装できる強力で拡張可能な API を提供します。以下に、これらの API の使用方法と、アニメーション シーンに応じてどの API を使用するかを説明します。
最新のモバイル アプリケーションでは、スムーズでわかりやすいユーザー エクスペリエンスを実現するためにアニメーションが不可欠です。Jetpack Compose アニメーション API の多くは、レイアウトや他の UI 要素と同様に、構成可能な関数として利用でき、Kotlin コルーチン一時停止関数で構築された低レベル API によってサポートされています。このガイドは、多くの実践的なシナリオで役立つ高レベル API から始まり、さらに制御とカスタマイズを可能にする低レベル API について説明していきます。
以下の図は、アニメーションにどの API を使用するかを決定するのに役立ちます。
ここに画像の説明を挿入

(1) レイアウト内のコンテンツの変化をアニメーション化したい場合:
表示と非表示をアニメーション化したい場合:
「可視性のアニメーション」を使用します。
状態に基づいてコンテンツを交換する:
コンテンツを相互に読み合わせている場合:
クロスフェードを使用します。
それ以外の場合は、AnimatedContent を使用します。
それ以外の場合は、Modifier.animateContentSize を使用します。
(2) アニメーションが状態に基づいている場合:
アニメーションが合成中に発生する場合:
アニメーションが無限である場合:
rememberInfiniteTransition を使用します。
複数の値を同時にアニメーション化する場合:
updateTransition を使用します。
それ以外の場合は、animate*AsState を使用します。
(3) アニメーションのタイミングをきめ細かく制御したい場合:
TargetBasedAnimation や DecayAnimation などのアニメーションを使用します。
(4) アニメーションが唯一の信頼できる情報源である場合は、
animateable を使用します。
(5) それ以外の場合は、AnimationState または animate を使用します。

1. 高レベルのアニメーション API
Compose は、多くのアプリケーションで使用されるいくつかの一般的なアニメーション パターン用の高レベルのアニメーション API を提供します。これらの API は、マテリアル デザイン モーションのベスト プラクティスに準拠するように調整されています。

1.1 アニメーションの可視性
AnimatedVisibility は、コンテンツの出現と消滅のアニメーションを組み合わせることができます。
コード例:
var editable by remember { mutableStateOf(true) }
AnimatedVisibility(visible = editable) { Text(text = “Edit”) }デフォルトでは、コンテンツはフェードインして拡大すると表示され、フェードアウトして縮小するとコンテンツが消えます。EnterTransition と ExitTransition を指定することで、トランジションをカスタマイズできます。コード例: varvisible by remember { mutableStateOf(true) } valdensity = LocalDensity.current AnimatedVisibility( visible =visible, enter = slideInVertical { // 上から 40 dp からスライドインします。with(density) { -40.dp.roundToPx() } } + ExpandVertical ly( // 上から展開します。expandFrom = Alignment.Top ) + fadeIn(















// 初期アルファ 0.3f でフェードインします。
InitialAlpha = 0.3f
)、
exit = slideOutVertively() + ShrinVertively() + fadeOut()
) { Text(“Hello”, Modifier.fillMaxWidth().height(200.dp)) }

1.2 サブオブジェクトの入口と出口のアニメーション化
AnimateVisibility のコンテンツ (直接または間接的なサブオブジェクト) は、animateEnterExit モディファイアを使用して、サブオブジェクトごとに異なるアニメーション動作を指定できます。各子の視覚効果は、AnimatedVisibility コンポジションで指定されたアニメーションと、子自身の出入りするアニメーションの組み合わせです。
AnimatedVisibility(
Visual Basic,
enter = fadeIn(),
exit = fadeOut()
) { // 背景と前景をフェードイン/フェードアウトします。Box(Modifier.fillMaxSize().background(Color.DarkGray)) { Box( Modifier .align(Alignment.Center) .animateEnterExit( // 内側のボックスをスライド イン/アウトします。enter = slideInVertively(), exit = slideOutVertively() ) .size In(minWidth = 256.dp, minHeight = 64.dp) .background(Color.Red) ) { // 通知の内容…














} } }
1.3カスタム アニメーションの追加 組み込みの開始および終了アニメーションに加えてカスタム アニメーション効果を追加する場合は、AnimatedVisibility のコンテンツ ラムダの Transition プロパティを通じて基本的な Transition インスタンスにアクセスする必要があります。Transition インスタンスに追加されたアニメーション状態は、AnimatedVisibility の開始および終了アニメーションと同時に実行されます。AnimatedVisibility は、トランジション内のすべてのアニメーションが完了するまで待機してから、そのコンテンツを削除します。トランジションとは独立して作成された終了アニメーション (animate AsState を使用するなど) の場合、AnimatedVisibility はそれらを解釈できないため、構成可能なコンテンツは完了前に削除される可能性があります AnimatedVisibility(visible =visible , enter = fadeIn ( ), exit = fadeOut() ) { // this: AnimatedVisibilityScope // AnimatedVisibilityScope#transition を使用して、カスタム アニメーションを// AnimatedVisibility.val 背景に追加します。 transition.animateColor { state -> if (state == EnterExitState.Visible) Color.Blue else Color.Gray }













Box(modifier = Modifier.size(128.dp).background(background))
}
1.4
AsStateの
アニメーション animate*AsState 関数は、単一の値をアニメーション化するための Compose の最も単純なアニメーション API です。終了値 (またはターゲット値) を指定するだけで、API は現在の値から指定された値までアニメーションを開始します。
val alpha: Float by animateFloatAsState(if (enabled) 1f else 0.5f)
Box(
Modifier.fillMaxSize()
.graphicsLayer(alpha = alpha)
.background(Color.Red)
)
1.5 アニメーションの子は AnimatedVis 機能を使用して出入りします
。 EnterExit 修飾子は、AnimatedContent のコンテンツ ラムダで使用できます。このオプションを使用して、EnterAnimation と ExitAnimation を各直接または間接の子オブジェクトに個別に適用します。
1.6 カスタム アニメーションの追加
AnimatedVisibility と同様に、遷移フィールドは AnimatedContent のコンテンツ ラムダで使用できます。このオプションを使用して、AnimatedContent トランジションと同時に実行されるカスタム アニメーション効果を作成します。
1.7 コンテンツ サイズのアニメーション
化 animateContentSize 修飾子は、サイズの変更をアニメーション化します。
var message by remember { mutableStateOf("Hello") }
Box(
modifier = Modifier.background(Color.Blue).animateContentSize()
) { Text(text = message) } 1.8 トランジションの更新トランジションは 1 つ以上のアニメーションを子として管理し、複数の状態で同時に実行します。状態は任意のデータ型にすることができます。enum class BoxState { Collapsed, Expanded } var currentState by remember { mutableStateOf(BoxState.Collapsed) } valtransition = updateTransition(currentState) val rect bytransition.animateRect { state -> when (state) { BoxState.Collapsed -> Rect(0f, 0f, 100f, 100f) BoxState.Expanded -> Rect(100f, 100f、300f、300f) } }

















val borderWidth bytransition.animateDp { state ->
when (state) { BoxState.Collapsed -> 1.dp BoxState.Expanded -> 0.dp } } enum class DialerState { DialerMinimized, NumberPad }




@Composable
fun DialerButton(isVisibleTransition: Transition) { //コンテンツが他の DialerStates について // 知る必要がなくなります。代わりに、コンテンツは// 表示と非表示の間の状態変化をアニメーション化することに重点を置くことができます。}
isVisibleTransition


@Composable
fun NumberPad(isVisibleTransition: Transition) { //コンテンツが他の DialerStates について // 知る必要がなくなります。代わりに、コンテンツは// 表示と非表示の間の状態変化をアニメーション化することに重点を置くことができます。}
isVisibleTransition


@Composable
fun Dialer(dialerState: DialerState) { valtransition = updateTransition(dialerState) Box { // NumberPadと // 表示と非表示の間のコンテンツ アニメーション用に、ブール型の子トランジションを個別に作成しますNumberPad( transition.createChildTransition { it == DialerState.NumberPad } ) DialerButton( transition.createChildTransition { it == DialerState.DialerMinim化されました} ) } }
















1.9 トランジションをカプセル化して再利用可能
にする 単純な使用例の場合、UI と同じコンポーザブルでトランジション アニメーションを定義することは非常に効果的なオプションです。ただし、複数のアニメーション値を持つ複雑なコンポーネントを扱う場合は、アニメーションの実装をコンポーザブル UI から分離することが望ましい場合があります。

これは、すべてのアニメーション値を含むクラスと、そのクラスのインスタンスを返す「更新」関数を作成することで実現できます。変換の実装は、新しい別の関数に抽出できます。このパターンは、アニメーション ロジックを一元化する必要がある場合、または複雑なアニメーションを再利用可能にする必要がある場合に役立ちます。
enum class BoxState { 折りたたまれた、展開された }

@Composable
fun AnimatingBox(boxState: BoxState) { val transitionData = updateTransitionData(boxState) // UI ツリーBox( modifier = Modifier .background(transitionData.color) .size(transitionData.size) ) }







// アニメーション値を保持します。
private class TransitionData(
color: State,
size: State
) { val color by color val size by size }


// トランジションを作成し、そのアニメーション値を返します。
@Composable
private fun updateTransitionData(boxState: BoxState): TransitionData { val transfer = updateTransition(boxState) val color =transition.animateColor { state -> when (state) { BoxState.Collapsed -> Color.Gray BoxState.Expanded -> Color.Red } } val size =transition.animateDp { state -> when (state) { BoxState.Collapsed -> 64.dp BoxState .Expanded -> 128.dp } } return remember(transition) { TransitionData(color, size) } } 2.低级アニメーション画API
















animate*AsState 関数は最も単純な API であり、瞬時の値の変更をアニメーション化された値としてレンダリングします。これは、単一の値をアニメーション化するためのコルーチンベースの API である Animatable によってサポートされています。updateTransition は、複数のアニメーション値を管理し、状態の変化に基づいてそれらを実行できる遷移オブジェクトを作成します。rememberInfiniteTransition は似ていますが、無限に実行される複数のアニメーションを管理できる無限の遷移を作成します。Animatable を除いて、これらの API はすべて合成可能です。つまり、これらのアニメーションは合成以外でも作成できます。
これらの API はすべて、より基本的なアニメーション API に基づいています。ほとんどのアプリケーションはアニメーションと直接対話しませんが、アニメーションのカスタム機能の一部は高レベルの API を通じて利用できます。
ここに画像の説明を挿入

2.1 Animatable
Animatable は、animateTo によって値が変更されたときにアニメーション化できる値ホルダーです。これは、animate*AsState 実装をサポートする API です。これにより、一貫した継続性と相互排他性が保証されます。つまり、値の変更は常に永続的であり、進行中のアニメーションはすべてキャンセルされます。
animateTo を含む Animatable の機能の多くは、サスペンド関数として提供されます。これは、適切なコルーチン スコープでラップする必要があることを意味します。
// グレーから開始し、ok
val に基づいて緑/赤にアニメーション化します color = remember { Animatable(Color.Gray) }
LaunchedEffect(ok) { color.animateTo(if (ok) Color.Green else Color.Red) } Box(Modifier.fillMaxSize().background(color.value)) 2.2 アニメーションアニメーションは、利用可能な最低レベルのアニメーション API です。これまでに見てきたアニメーションの多くは、アニメーションの上に構築されています。TargetBasedAnimation と DecayAnimation の 2 つのアニメーション サブタイプがあります。アニメーションは、アニメーションのタイミングを手動で制御する場合にのみ使用できます。アニメーションはステートレスであり、ライフサイクルの概念がありません。これは、高レベル API によって使用されるアニメーション計算エンジンとして機能します。2.2.1 ターゲットベンチマークアニメーション






他の API はほとんどのユースケースをカバーしますが、TargetBasedAnimation を使用すると、アニメーションの再生時間を直接制御できます。以下の例では、TargetAnimation の再生時間は、FrameNanos によって提供されるフレーム時間に従って手動で制御されます。
val anim = remember { TargetBasedAnimation( animeSpec = tween(200), typeConverter = Float.VectorConverter, InitialValue = 200f, targetValue = 1000f ) } var playTime by remember { m utableStateOf(0L) }







LaunchedEffect(anim) { val startTime = withFrameNanos { it }

do {
    playTime = withFrameNanos { it } - startTime
    val animationValue = anim.getValueFromNanos(playTime)
} while (someCustomCondition())

2.2.2
カスタム アニメーション
多くのアニメーション API は通常、動作をカスタマイズするためのパラメーターを受け入れます。
アニメーションの仕様
ほとんどのアニメーション API では、開発者はオプションのAnimationSpec パラメータを使用してアニメーションの仕様をカスタマイズできます。
val alpha: Float by animateFloatAsState(
targetValue = if (enabled) 1f else 0.5f,
// アニメーションの継続時間とイージングを設定します。animationSpec
= tween(durationMillis = 300, easing = FastOutSlowInEasing)
)
2.2.3 tween animateFloatAsState( targetValue = 1f , animeSpec = twe) で
アニメーションの
val 値を設定します。 en( 持続時間ミリス = 300 、遅延ミリス = 50、



2.2.4 キーフレーム
キーフレームは、アニメーション期間中のさまざまなタイムスタンプで指定されたスナップショット値に基づいてアニメーション化されます。アニメーション値は常に 2 つのキーフレーム値の間で補間されます。これらのキーフレームごとに、イージングを指定して補間カーブを決定します。
必要に応じて、値 0 ミリ秒と期間を指定します。これらの値が指定されていない場合、デフォルトでアニメーションの開始値と終了値がそれぞれ設定されます。
animateFloatAsState(
targetValue = 1f,
animeSpec = keyframes { durationMillis = 375 0.0f at 0 with LinearOutSlowInEasing // for 0-15 ms 0.2f at 15 with FastOutLinearInEasing // for 15- 75 ms 75 // ミリ秒で0.4f 225 // ミリ秒で 0.4f } )






2.2.5finityRepeatablefinityRepeatable
はRepeatableに似ていますが、反復回数を無限に繰り返します。
animateFloatAsState(
targetValue = 1f,
animationSpec =infiniteRepeatable(
animation = tween(durationMillis = 300),
repeatMode =RepeatMode.Reverse
)
)によるval値
(2)トランジションアニメーション(Transition)

レイアウト変更にアニメーション効果を追加するには、おそらく次のような処理が必要になります:
(1). 開始レイアウトと終了レイアウトの Scene (シーン) オブジェクトを作成します。ただし、初期レイアウトのシーンは通常、現在のレイアウトに従って自動的に決定されるため、ほとんどの場合、初期レイアウトの Scene オブジェクトを作成する必要はありません。
(2). Transition オブジェクトを作成して、目的のアニメーション タイプを定義します。
(3). TransitionManager.go() を呼び出すと、システムはアニメーションを実行してレイアウトを交換します。
再版の一部は次のとおりです: https://blog.csdn.net/xojian197/article/details/117290583
1.1 シーンの作成
レイアウト ファイルから直接シーン インスタンスを作成できます。Scene.getSceneForLayout() を呼び出します。このメソッドは 3 つのパラメーターを受け入れます。最初のパラメーターはシーンが配置されている ViewGroup、2 番目のパラメーターはシーンのレイアウト ファイル ID、3 番目のパラメーターは Context オブジェクトです。
2.1.1

<?xml バージョン="1.0" エンコーディング="utf-8"?>

<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:
layout_height="match_parent">
<androidx.app compat.widget.Toolbar
android:id="@+id/toolbar"
… >
</androidx.appcompat.widget.Toolbar>


</androidx.constraintlayout.widget.ConstraintLayout>
2.1.2 最初のシーン レイアウト ファイルは次のとおりです:

<TextView
android:id="@+id/text_view"
.../> <
ImageView
android:id="@+id/image_view" ...
/>

2.1.3 2 番目のシーン レイアウト ファイルは次のとおりです:

<ImageView
android:id=”@+id/image_view”
…/>
<TextView
android:id=“@+id/text_view”
…/>

2.1.4 2 つのシーンのレイアウトは、(同じ ID を持つ) 2 つのビューの位置を交換するだけです。次のコードは、レイアウト ファイルから Scene オブジェクトを作成する方法を示しています: val sceneRoot: ViewGroup = findViewById(R.id.scene_root) val aScene: Scene = Scene.getSceneForLayout(sceneRoot, R.layout.a_scene, mContext) val bScene: Scene = Scene.getScene ForLayout(sceneRoot, R.layout.b_scene, mContext) 2.1.5 遷移アニメーション タイプの作成 遷移アニメーション タイプは、リソース ファイルから、またはコードから直接指定でき
ますリソース ファイルでトランジション アニメーション タイプを指定する必要がある場合は、res/transition/ ディレクトリに追加できます。以下のファイルはフェード トランジションを指定します。res/transition/fade_transition.xml 2.1.6 コード内で TransitionInflater を使用して、トランジション アニメーションを読み込みます。ValfadeTransition=TransitionInflater.from(mContext).inflateTransition(R.transition.fade_transition) 2.2 トランジションを開始します。2.2.1 TransitionManager.go() を呼び出して、トランジション アニメーションを開始します。このメソッドは 2 つのパラメーターを受け入れます。最初のパラメーターはレイアウトの終了シーン オブジェクト (終了シーン)、2 番目のパラメーターはトランジション アニメーション タイプ (トランジション) のインスタンスです。また、トランジションアニメーションの種類も指定できません。フレームワークはデフォルトのトランジションを使用してシーン間をアニメーション化します。デフォルトでは、シーンを終了すると終了アニメーションが実行され、シーンに入る場合は開始アニメーションが実行されます。










2.2.2 ただし、シーンに出入りするときに追加の操作が必要になる場合があります。たとえば、同じ階層にないビューにアニメーション効果を追加します。この時点で、Runnable オブジェクトを作成し、Scene.setExitAction() メソッドまたは Scene.setEnterAction() メソッドに渡すことができます。フレームワークは、トランジション アニメーションを実行する前に開始シーンで setExitAction() メソッドを呼び出し、トランジション アニメーションの実行後に終了シーンで setEnterAction() メソッドを呼び出します。
シーンを使用しない遷移
2.2.3 ビュー階層を変更することはインターフェイスを変更する唯一の方法ではなく、現在のビュー階層内のサブビューを変更することもできます。単一のビュー階層でトランジションを適用するようにインターフェイスを変更する場合は、TransitionManager.beginDelayedTransition() を使用して遅延トランジションを作成できます。遷移アニメーション フレームワークは、インターフェイス内のサブビューが変化するときに、元の状態と新しい状態の間の遷移をアニメーション化します。
デフォルトのアクティビティ切り替えアニメーションを
変更する必要がある場合は、トランジション アニメーションを使用してアクティビティの切り替えにアニメーション効果を追加します。 2.2.4 Android 5.0 より前。startActivity() とfinish() の後に、overridePendingTransition() メソッドを追加する必要がある場合があります。このメソッドは 2 つのパラメータを受け入れます。最初のパラメータはアニメーションを開始するためのもので、2 つ目のパラメータはアニメーションを終了するためのものです。たとえば、アクティビティ A がアクティビティ B を開きます。最初のパラメータは B の開始アニメーション、2 番目のパラメータは A の終了アニメーションです。Return キーを押してアクティビティ B を閉じます。最初のパラメータは A の開始アニメーション、2 番目のパラメータは B の終了アニメーションです。
または、テーマ スタイル ファイルで個別に設定します。

2.2.5 遷移アニメーションは、新しいアクティビティ遷移アニメーションをもたらします。これらの遷移アニメーションは、アクティビティ内のビューに向けることができます。開始と終了のトランジション、およびアクティビティ間の共有要素のトランジションにすることができます。
1. 入口トランジションは、アクティビティ内のビューがシーンに入る方法を決定します。
2. 出口トランジションは、アクティビティ内のビューがシーンから出る方法を決定します。 3.
共有要素トランジションは、2 つのアクティビティによって共有されるビューがこれらのアクティビティ間でどのようにトランジションするかを決定します。

Android では、次の 3 つの開始および終了遷移がサポートされています。
1. 分解し、ビューをシーンの中心の内外に移動します。
2. スライドして、シーンのいずれかの端からビューを内外に移動します。
3. ビューの不透明度を変更してフェードし、シーン内でビューを追加または削除します。

2.2.6 Android は、次の共有要素の遷移もサポートしています。
1. ChangeBounds は、ターゲット ビューのレイアウト境界の変更にアニメーション効果を追加します。
2.ChangeClipBounds は、ターゲット ビューのクリッピング境界の変更にアニメーション効果を追加します。
3.ChangeTransform は、ターゲット ビューのズームと回転の変更にアニメーション効果を追加します。
4.ChangeImageTransform は、ターゲット イメージのサイズとズームの変更にアニメーション効果を追加します。

2.2.7 Activity の切り替えのトランジションを指定するコード
Window.setEnterTransition() は、Activity を開くための入口トランジションを指定
Window.setExitTransition() は、Activity を開き
、アクティビティをフォアグラウンドで終了させる出口トランジションを指定
ity の出口トランジション

通常の状況では、EnterTransition と ExitTransition を設定するだけで済みます。ReenterTransition は ExitTransition の逆バージョンを使用し、ReturnTransition は EnterTransition の逆バージョンを使用します。次のコードは、右端からスライドするアクティビティのエントリ トランジションを指定しています
fun setupWindowAnimations() { val slideTransition = Slide().apply { slideEdge = Gravity.END period = 300L } window.enterTransition = slideTransition } 2.2.8 または、テーマ スタイル ファイルでアクティビティのトランジションを指定することもできます






2.2.9 最後に、トランジションアニメーションを機能させます。アクティビティは startActivity(Intent インテント、バンドル オプション) で開始する必要があり、アクティビティを閉じるときにfinishAfterTransition() を呼び出す必要があります。Bundle オブジェクトは、ActivityOptionsCompat.makeSceneTransitionAnimation(Activity activity) メソッドによって取得できます。
val options = ActivityOptionsCompat.makeSceneTransitionAnimation(this)
startActivity(intent, options)
2.3 共有要素の遷移
共有要素の遷移アニメーションを開始するのは簡単です。
1. まず、ターゲットアクティビティの共有ビューにtransitionName属性を追加します。
2. ActivityOptionsCompat.makeSceneTransitionAnimation(Activity activity, ViewsharedElement, StringshareElementName) メソッドを使用して、Bundle オブジェクトを取得します。パラメータsharedElementは、ターゲットアクティビティに遷移するビューを表します。sharedElementNameは、ターゲットアクティビティ内の共有ビューのtransitionName属性値を表します。
3. startActivity(Intent インテント、バンドル オプション) を使用して、ターゲット アクティビティを開始します。
3. 移行マネージャー
このクラスは、シーンが変化するときに起動される一連のトランジションを管理します。マネージャーを使用するには、シーンと setTransition(android.transition.Scene, android.ttransition.transition) または setTransition(android.transition.Sene, android.Ttransition.Scene., android.teransition.Transaction) を呼び出すトランジション オブジェクトを追加します。シーンの変更に特定のトランジションを設定する必要はありません。デフォルトでは、シーンの変更は「自動トランジション」を使用して、ほとんどの状況に適した処理を実行します。特定のシーンの変更に対して、アプリケーションが異なる遷移動作を必要とする場合にのみ、追加の遷移を指定する必要があります。

TransitionManager は、res/transition ディレクトリ内の XML リソース ファイルで宣言できます。TransitionManager リソースは、TransitionManager タグ名で構成され、1 つ以上のトランジション タグが含まれます。各トランジション タグは、トランジションとタグ内のシーンの開始/終了情報の間の関係を記述します。たとえば、いくつかのシーン トランジションを宣言するリソース ファイルを次に示します。

fromScene プロパティと toScene プロパティのそれぞれに、標準 XML レイアウト ファイルへの参照があります。これは、コードで scene#getSceneForLayout(ViewGroup, int, Context) を呼び出してレイアウトからシーンを作成するのと同じです。トランジション プロパティについては、トランジションを説明する res/transition ディレクトリ内のリソース ファイルへの参照があります。
3.1概要
ここに画像の説明を挿入
ここに画像の説明を挿入

3.2パブリック メソッド
beginDelayedTransition
open static fun beginDelayedTransition(sceneRoot: ViewGroup!):
このメソッドの呼び出しとデフォルトのトランジションを使用した次のレンダリング フレームの間の、指定されたシーン ルートのすべての変更によって定義される新しいシーンにアニメーション化するユニットの便利なメソッド。beginDelayedTransition (android.view.ViewGroup、android.transition.transition) の呼び出しと同等で、transition パラメーターの値は null です。
ここに画像の説明を挿入

3.3beginDelayedTransition
open static fun beginDelayedTransition(
sceneRoot: ViewGroup!,
transition: Transition!
): Unit
ここに画像の説明を挿入

王凱格 116052020083 http://t.csdn.cn/aaMeD

おすすめ

転載: blog.csdn.net/fjnu_se/article/details/128209765