动画作用预览

MaterialContainerTransform

遇到的问题

在RecyclerView的Adapter中运用Glide.with(fragment)加载图片会影响动画的观感

在没有动画的正常情况下应该运用Glide.with(fragment)加载elementary怎样读音图片

有动画的情况下elementui运用Glide.with(fragment)git教程加载图片会呈现动画还giticomfort没完毕,图片资源就被拾掇了,图片被拾掇后闪现的是占位图,体会欠好

如果以Gappleidlide.with(context)结束会有内存走漏风险

处理方式: 把ImageView添加Set集合,在离场过渡动画完毕时(TransitionEx)apple使用Glidelement是什么牌子e.with(context).clear(imageView)拾掇资源。

结束进程

1、定义抽象类BaseShareFelementaryragment,由于每个片段都需求设置相elements同的特点。

const val KEY_TRANS_NAME = "KEY_TRANS_NAME"
abstract class BgiteeaseShareFragment<V : ViewBinding>(layoutId: Int) : BaseFragment<V>(layoutId),
RecyclerViewClearHelper {
/**
* truelement是什么牌子e 子类接收 startPostpoapplicationnedEnterTransition()
* false view接收
*/
protected var startPostponelementaryedEnterTransition =github是干什么的 true
/**
* 用于approach过渡动画完毕时拾掇资源
*/
overrelementuiide vapp装置下载ar recyclerView: RecyclerView? = null
/**
* 用于过渡动画结git命令束时拾掇资源
*/
override var imageClearHelper: ImageCgitilearHelper? = nulgiticomfortl
init {
// ⭐⭐⭐动Element画作用要害结束⭐⭐⭐
// 离场时坚持当时视element是什么牌子图直到下个片段进场结束
exitTransition = Hold()
//默许动画
sharedElementEnterTransition = MaterialContainerTransfelementanimationorm()
}
override fun onViewCreated(view: View, savedInselementui菜鸟教程tanceState: Bundleappstore?)elementary是什么意思 {
super.onViewCreated(view, savedInstanceState)
// ⭐⭐⭐动画作用要害结束⭐⭐⭐
val name = arggithubuments?.getString(KEY_TRANS_NAME)
view.transitionName = name
// ⭐⭐⭐动画作用appearance要害approve结束⭐⭐⭐
// 推迟片段转化直到startPostponedEnterTransition()被调用
postponeEnterTransition()
if (startPostponedEnterTransition) {
view.doOnPreDraw {
startPostponedEnterTransition()
}
}
}
}

postponeEnterTransition():作用是推迟片段转化直到startPostponedEnterTrappreciateansition()被调用。

startPostponedEnterTransition():作用是发起片段转化,比如说片段A->片段B,需求等候片段B的图片被加载成功或失利之后再实施动画,在片段B的onViewCreate中实施postponeEnterTransition(),在加载图片的回调中调Element用startPostponedEnterTransition()。

2、结束CountryFragment,列出与Glide相关部分代码。

class CountryFragment : BaseShareFragment<FragelementanimationmentRecyclerViewBinding>(R.layout.fragment_recycler_view) {
override fun onViewCreated(view: View, savedInstanceStatgithub是干什么的e: Bundle?) {
selementuiuper.onViewCreated(view, savedInstappreciateanceState)
// 用于动画完毕时拾掇图片资源
recyclerView =appear binding?.recyclerView
// 动画完毕时拾掇RecyclerViewelements
// 在Tv这个项目中,是没有下面这一行代appstore码,由于CountryFrgitlabagment是嵌套element什么意思中文在HomeFragment中,所以是approach在HomeFragment
// 中拾掇资源
doOnExitTransitionEndOneShot { clearRecyclerView() }
// CountryAdapter 结束了ImageClearHelper接口
imageClearHelper = countryAdaelement什么意思中文pter
}
}

TransitionEx此类供应两个方法在动画离场时收elementary拾图片资源。

/**elementui
* 当片段退出过渡动画实施完毕时拾掇图片资源防止内存approach走漏
* 运用Glide.with(fragment)时,oelementarynDestroyView会铲除ImageView资源,可git命令是会影响动画观感,闪现一片占位图
* 所以运用该方法以便在动画完毕时拾掇ImageView资源
*
* 假设有三个片段A,B,C,三个片段都有图片列表,跳转次序是A-B-C,
*
* A->B 要铲除Aappleid的资源
* 那么在APPA的在onViewCreate中设置
* @see doOnExitTransitionEndOneShot(doOnExitTragithub中文官网nsition)
*
* B->A 要铲除B的资源app装置下载
* 那么在B的在onCreate中设置
* @see dgiteeoOnShagiteeredElementReturnTransitiongit命令End(doOnReturnTransitionEnd)
* 由于 popBackStack()实施的退出动画是
*Element @see Fragment.getSharedElementReelementsturnTransition
*
* B->C 要铲除B的资源
* 那么在B的在onViewCreate中设置
* @see doOnExitTransitionEndOneShoappearancet(doOnEelementuixitTransielementstion)
*
* C->B 要铲除C的资源
* 在B的在onCreate中设置
* @see doOnappearSharedElemapplicationentReturnTraelementary怎样读音nsitionEnd(doOnReturnTransitionEnd)
* 由于 popBackStack()实施的退出动画是
* @see Fragment.ggiteeetSharedElementReturnTransition
*/
fun Fragment.doOnSharedElementReturnTransitionEnd(
doOnReturnTransitionEnd: (() -> Unit)? = null
) {
(sharedElementReturnTransition as TappearransiElementtionelementui菜鸟教程?)?.addListener(obapplicationject :
DefaultTransitionListener() {
override fun onTransitionEnd(transition: Transition) {
if (view == null) {
doOnReturnTransitionEnd?.invoke()
transition.rapproveemoveListener(this)
}
}
})
}
fun Fragment.doOnExitTransitionEndOneShot(doOnExitTransitgiti轮胎是什么品牌ion: () -> Unit) {
val trans = exitTraapplensition as Transition?
val defaultTransielementarytionListener = object : DefaultTransitionListener() {
override fun onTransitionEnd(transition: Transition) {
if (view == nullapple) {
doOnExitTransition.invoke()
trelementuians?.removeListener(this)
}
}
}
tapplerans?.addListener(defaultTransitionListener)
}

3、CountryAdapter,完giti结了ImageClearHelper接口,在动画完毕时拾掇资源。

class CountrygiteeAdapter(
// 拾掇图片资源
private vaelementary怎样读音l clearHelper: ImageClearHelper = GlideCleagitlabrHelper(),
// 在没有动画的正常情况下应该运用Glide.with(fragment)加载图片
// 有动画的情况下运用Glide.with(fragment)加载图片会呈现动画还没完毕,图片资源就被拾掇了,
// 图片被拾掇后闪现的是占位图,体会欠好
private val fapp装置下载ragment: Fragment
) : BaseListAdapter<Country, ImageViewHolder>(CountryDiff), ImageClearHelper by clearHelper {
oappstoreverrelementary是什么意思ide fun onCreateViewHolder(parent: ViewGroup, viewType:elementui Int): ImageViewHolder =
ImageViewHolder.create(parent)
override fun onBingithub是干什么的dViewHolder(hoGitlder: ImageViewHolder, position: Int) {
super.onBindViewHappearolder(holder, position)
// ⭐⭐⭐动画作用要害结束⭐⭐⭐
// 注意:重建后的recyclerview Item是没有transName的
// 所以在onBind要从头赋值一遍 动画作用才会有~
holder.iteappreciatemView.transitionName = currentList[position].name
val item = getItem(position)
val tvName = hgitlabolder.binding.tvName
val ivPreview = holder.binding.ivPreview
holder.binding.flBappstoreutton.isVisible = false
// 添加需求拾掇的ImageView
images.add(ivPreview)
if (Locale.getDefault().language.celementaryontains("zappearh")) {
tvName.text = item.namelement是什么牌子eChinese
} else {
tvName.text = item.nameelement翻译
}
// 运用上下文加载
ivPreview.load(itapproachem.image)
// 运用fappleragment加载
// ivPrevelementui菜鸟教程iew.load(fragment,item.image)
}
}

4、CountryFragment跳转VideoListFragment

fun Fragment.homeToVideoList(
// 点击的那个ItemView,要同Git享的元素
view: View,
telementuiitle: String
) {
replaceWithShareElement(
VideoListFragment.newInstance(view.transitionappearName, title)apple,
VideoListFragmeappearnt.TAG,
view
)
}
fun Fragment.replaceWithShareElgithub中文官网ement(
fragment: Fragelementary是什么意思ment,
tag: String?,
// 点击的那个ItemView,要同享的元素
share: View
) {
requireActivityapprove().supportFragmentManager.gitlabbeginTranselementary是什么意思action()
.setReorderingAllelementsowed(true)
.addSharedElement(share, share.transitionName)
.replace(R.id.main_container, fragment, tag)
.addGitToBackStack(tag)
.commit()
}

5、VideoLielement翻译stFragment

class VideoListFragment : ListFragment() {
companion object {
const val TAG = "VideoListFragment"
fun newInstance(transName: String, title:app装置下载 Strapproaching): VideoLielement什么意思中文stFgit教程ragment {
returappreciaten VideoListFragment().apply {
arguments = Bundle().apply {
// ⭐⭐⭐动画作用要害结束⭐⭐⭐
// 同享元素-名称
// BaseShareFragment.view.elementanimationtranstitionName="elementary是什么意思xxx"
putString(KEY_TRANS_NAME, transName)
putString(KEY_TITLE, title)
}
}
}
}
override fun onCreate(savedInstagithub是干什么的nceState: Bundle?) {
super.onCreate(saelement什么意思中文vedInstanceState)
// 用于离场时拾掇资源
doOnSharedElementReturnTransitionEnd { clearRecyclerView() }
}
overrelementuiide fun ongithub是干什么的ViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val adgiteeapter = TvAdapter(buttonClickListener)
//git命令 adapter结束了ImageClearHelper
// 用giti于离场时拾掇资源
imageClearHelper = adapter
}
}

相关链接

gitee.com/bytebyte6/T…

gitee.com/bytebyte6/T…

gitee.com/bytebyte6/T…