ActivityOptions.makeSceneTransitionAnimation第一次没有工作

时间:2018-06-03 10:24:54

标签: android kotlin

我希望在用户点击具有ImageView的适配器项目中的RecyclerView时进行转换。

动画在首次点击后有效,但不是第一次用户按下View

第一次点击后,它与同一ImageView完美配合。但是如果我从RecyclerView的另一个项目中按下另一个图像,则第一次也不起作用。

这是适配器内的代码:

holder.ivCommentItemAttachment.setOnClickListener { v ->
    val intent = Intent(context, ImageActivity::class.java)
    intent.putExtra(ImageActivity.EXTRA_IMAGE_URL, imageAttachmentUrl)
    val transitionName = ImageActivity.TRANSITION_IMAGE
    v.transitionName = transitionName
    val options = ActivityOptions.makeSceneTransitionAnimation(context, v, transitionName)
    context.startActivity(intent, options.toBundle())
}

与图像的活动:

class ImageActivity : AppCompatActivity() {

    companion object {
        const val EXTRA_IMAGE_URL = "image"
        const val TRANSITION_IMAGE = "transitionImage"
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_image)
        ivImage.transitionName = TRANSITION_IMAGE
        loadCover(this, intent.getStringExtra(EXTRA_IMAGE_URL), ivImage)
        ivImage.setOnClickListener { finishAfterTransition() }
    }
}

1 个答案:

答案 0 :(得分:1)

请注意,请务必从XML中删除任何android:transitionName

我认为您遇到问题的原因是您在onClick中设置了转换名称。这就是为什么在第一次点击时转换不起作用,因为未设置名称,并且在第二次点击上已经设置了名称(来自首次点击)因此过渡有效。解决方案是将转换命名从setOnClickListener移至onBindViewHolder,以便在点击发生之前设置转换名称。

修改

如果不是出于上述原因或过渡名称混淆,那么可能是由于转换发生时ImageView的准备就绪,在这种情况下,您需要推迟转换,直到视图准备就绪。

尝试ImageActivity onCreate中的supportPostponeEnterTransition()来呼叫ImageView(因为我认为您使用的是转型库的支持版本),以及将图像加载到ImageActivity时1}}当它准备好时加载它。使用 Picasso 或任何其他类似的库时更容易实现,因此onCreate @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_image); supportPostponeEnterTransition(); // inflate you views // get your image URL Picasso.with(this) .load(imageUrl) .noFade() .into(imageView, new Callback() { @Override public void onSuccess() { supportStartPostponedEnterTransition(); } @Override public void onError() { supportStartPostponedEnterTransition(); } }); } 看起来像这样:

call plug#begin('~/.vim/plugged')