Androidの共有要素

これは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に設定するだけです。これは最善の解決策ではありませんが、問題も解決されています。

おすすめ

転載: blog.csdn.net/Ser_Bad/article/details/87913305