これはAndroid共有要素の方法の記録です。私はたくさんの穴を踏みました。実際、それは非常に簡単です。Android共有はAndroid5.0から提供されます。互換性のために以前のバージョンには触れませんでしたが、実際には解決策があります。これは踏まれたピットの記録であり、共有要素の詳細な分析はありません。
最初にページAからページBにジャンプし、次にページAは呼び出すだけで済みます
ActivityCompat.startActivity(context, intent, ActivityOptionsCompat.makeSceneTransitionAnimation(context, view, "zoomImageView").toBundle())
共有するビューと共有ビューのtransitionNameを渡す必要があることに注意してください。次に、共有するビューに同じtransitionNameをページBに設定します。
ピットを踏んだ後、フレスコ画を使用している場合は、ページが破壊されたときにページのビューを維持する必要があります。
ActivityCompat.setExitSharedElementCallback(context, object : SharedElementCallback() {
override fun onSharedElementEnd(sharedElementNames: List<String>?,
sharedElements: MutableList<View>?, sharedElementSnapshots: MutableList<View>?) {
super.onSharedElementEnd(sharedElementNames, sharedElements, sharedElementSnapshots)
for (view in sharedElements!!) {
if (view is SimpleDraweeView) {
view.show()
}
}
}
})
それでも機能しない場合は、ページBのonCreateに次のコードを追加するだけです。Frescoは依然として非常に反人間的であり、あらゆる種類の奇妙な問題があります。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
window.sharedElementEnterTransition = AutoTransition() // 进入
window.sharedElementReturnTransition = AutoTransition()// 返回
ActivityCompat.setEnterSharedElementCallback(this, object : SharedElementCallback() {
override fun onSharedElementEnd(sharedElementNames: List<String>?,
sharedElements: List<View>?, sharedElementSnapshots: List<View>?) {
for (view in sharedElements!!) {
if (view is PhotoDraweeView) {
(view as PhotoDraweeView).setScale(1f, true)
}
}
}
})
}
最後に共有要素のアニメーション効果を持たせたい場合は、を呼び出す必要があります
finishAfterTransition()
ページBの終了時にコールバックする必要がある場合、コールバックの結果はstartActivityForResult
同じです。finishAfterTransition
メソッドの後に呼び出す必要がありsetResult
ます。ページBのコードは次のとおりです。
override fun finishAfterTransition() {
val resultData = Intent()
resultData.putExtra(CURRENT_ITEM,“要回调的值”)
setResult(Activity.RESULT_OK, resultData)
super.finishAfterTransition()
}
Aページで受け入れられているメソッドは、フラグメントの場合はonActivityReenter
メソッドがないことに注意してください。ただし、インターフェイスをカスタマイズして、次のコードで呼び出すことができます。
override fun onActivityReenter(resultCode: Int, data: Intent) {
super.onActivityReenter(resultCode, data)
val list = supportFragmentManager.fragments
list.forEach {
if (it is MyFragment) {
it.onReenter(resultCode, data)
}
}
}
//MyFragment中定义的方法
open fun onReenter(resultCode: Int, data: Intent) {
}
これでほぼ完了です。これらは基本的な共有要素のアニメーションを満たすことができます。正しいtransitionNameを設定する必要があることに注意してください。
フレスコピットもあります。Aページに戻ったときに共有要素が消えてしまった場合は、設定できます。
setLegacyVisibilityHandlingEnabled(true)
これは、fresco1.4によって追加された共有u要素のバグ修正です。
うまくいったと思うものを投稿してください
私の場合、2ページ目はViewPagerを使用しているため、ViewPgaerのキャッシュの問題により、毎回返されるアイテムが間違っているため、transitionNameをViewPagerに設定するだけです。これは最善の解決策ではありませんが、問題も解決されています。