2017-12-26 31 views
0

私は2つのアクティビティ間で非常に単純な遷移を持ち、ときどきイメージが途中で停止し、遅れて黒色に点滅します。Glideを使用したシンプルな共有要素トランジションの遅れ

私はGlideで共有要素トランジションを何回も使用していますが、今回は遅くすることはできません。

これは最初のアクティビティである:

val intent = Intent(this, MediaZoomImageActivity::class.java) 
intent.putExtra(MediaZoomActivity.ZOOM_MEDIA_URL, submission.imageUrl) 

val bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(this, 
      post_image_parallax, ViewCompat.getTransitionName(post_image_parallax)).toBundle() 

startActivity(intent, bundle) 

これは第二活動である:

override fun onCreate(savedInstanceState: Bundle?) { 
    super.onCreate(savedInstanceState) 
    setContentView(R.layout.activity_zoom_image) 
    postponeEnterTransition() 

    back.setOnClickListener { finish() } 

    val url = intent.getStringExtra(ZOOM_MEDIA_URL) 
    Glide.with(this) 
      .load(url) 
      .apply(RequestOptions().diskCacheStrategy(DiskCacheStrategy.RESOURCE)) 
      .into(media_zoom_image) 

    media_zoom_image.viewTreeObserver.addOnPreDrawListener(object : ViewTreeObserver.OnPreDrawListener { 
     override fun onPreDraw(): Boolean { 
      media_zoom_image.viewTreeObserver.removeOnPreDrawListener(this) 
      startPostponedEnterTransition() 

      return true 
     } 
    }) 

これは第二活性のレイアウトである:

  1. constraintLayout
  2. -backbutton(のImageButton)
  3. -image(ImageViewの)

これはアニメーションです:

<changeBounds 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:duration="200" /> 

それは非常に簡単ですが、私は私の頭をラップすることはできませんその周りに。 2番目の画像には、もともとジェスチャーを使用するリスナーがいましたが、それが理由だと思っていましたが、すべてのコメントにはまだ遅れがあります。 最初のアクティビティのイメージは、同じtransitionNameを持つ別の共有要素トランジションの対象です。問題はありますか? 何か間違っていますか? ConstraintLayoutの問題ですか?グライドに問題はありますか?

ご協力いただきありがとうございます。

答えて

1

代わりにPreDrawListenerを使用して、glideでリスナーを使用すると修正されます。タイミングの問題

Glide 
      .with(this) 
      .asBitmap() 
      .load(url) 
      .apply(RequestOptions().diskCacheStrategy(DiskCacheStrategy.RESOURCE)) 
      .listener(new RequestListener<Bitmap>() { 
       @Override 
       public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Bitmap> target, boolean isFirstResource) { 
        return false; 
       } 

       @Override 
       public boolean onResourceReady(Bitmap resource, Object model, Target<Bitmap> target, DataSource dataSource, boolean isFirstResource) { 
        media_zoom_image.setImageBitmap(resource); 
        startPostponedEnterTransition(); 
        return true; 
       } 
      }) 
      .into(media_zoom_image); 

私はonResourceReadyブロックを更新したあなたは

media_zoom_image.viewTreeObserver.addOnPreDrawListener(object : ViewTreeObserver.OnPreDrawListener { 
    override fun onPreDraw(): Boolean { 
     media_zoom_image.viewTreeObserver.removeOnPreDrawListener(this) 
     startPostponedEnterTransition() 

     return true 
    } 
}) 

UPDATE

を削除していることを確認しているように見えます。それを試してみてください。可能な限り早期に

Glide 
     .with(this) 
     .asBitmap() 
     .load(url) 
     .apply(RequestOptions().diskCacheStrategy(DiskCacheStrategy.RESOURCE)) 
     .listener(new RequestListener<Bitmap>() { 
      @Override 
      public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Bitmap> target, boolean isFirstResource) { 
       return false; 
      } 

      @Override 
      public boolean onResourceReady(Bitmap resource, Object model, Target<Bitmap> target, DataSource dataSource, boolean isFirstResource) { 
       startPostponedEnterTransition(); 
       return false; 
      } 
     }) 
     .into(media_zoom_image); 

UPDATE 2

コールpostponeEnterTransition

override fun onCreate(savedInstanceState: Bundle?) { 
super.onCreate(savedInstanceState); 

postponeEnterTransition(); // Called it before set content. Try to call it before super.onCreate to see if it also works? 

setContentView(R.layout.activity_zoom_image); 
... 
}) 

UPDATE 3

あなたのイメージを最適化します。それにはいくつかのオンラインウェブサイトやツールがありますが、グラフィックデザイナーに尋ねることもできます。

また、スムーズな読み込みに時間を要するアニメーションの時間を長くすることができます。

<changeBounds 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:duration="300" /> 

glideのリスナーは、bitmapを表示するように設定する前に実行されます。ピカソとグライドの違い、ピカソはオプションとしてコールバックパラメータをinto()メソッドに持っています。ビットマップを表示するように設定した後にonSuccess()を実行します。ですから、私たちの共有遷移を実行する実行は、(ImageView#setBitmapImage)はすでに延期されている間に実行されました。この状況でピカソはもう少し輝いています。

+0

このソリューションでは、それほど頻繁にやることはないようですが、それでもまだあります。 –

+0

タイミングの問題であるかどうかわかりませんが、一部の画像では問題があるように見えます。 また、これは初めて発生します。なぜなら、私が2回目に戻ってしまうと、スムーズです。キャッシングの問題になりますか? –

+0

初めて画像を読み込むための時間です。それは動作するはずです、私は問題がアニメーション中にイメージビューを再描画しようとしていると思います。私は答えを更新するつもりです。あなたはそれを試すことができますか? –

関連する問題