1.简介
Skeleton Screen(加载占位图)是近年流行的加载控件,通常表现形式是在界面上待加载区域填充灰色的占位图,与线框图的效果非常相似。Skeleton Screen 本质上是界面加载过程中的过渡效果。
使用 Skeleton 的效果图如下:

2.工作原理
从上面的效果图,不难看出,「Skeleton」有一个显示和隐藏的过程。下面针对普通的 view 和 RecyclerView 分别说明其中的显示/隐藏的过程。
2.1 对于普通的 View
从常规的使用方法看起。
|
|
首先调用了 Skeleton.bind();
|
|
bind 方法返回的是一个 ViewSkeletonScreen.Builder
也就是一个建造器,其中提供了各种配置方法。
|
|
设置好之后,调用 show,即可将 Skeleton 显示 出来
ViewSkeletonScreen.Builder#show
|
|
Builder#show 方法返回的是一个 ViewSkeletonScreen 对象。
ViewSkeletonScreen 实现了 SkeletonScreen 接口。
|
|
2.1.1 显示
ViewSkeletonScreen#show()
|
|
1.生成 loadingView
|
|
2.显示
|
|
判断条件
|
|
2.1.2 隐藏
com.ethanhua.skeleton.ViewSkeletonScreen#hide
|
|
com.ethanhua.skeleton.ViewReplacer#restore
其实就是 replace 方法的逆向。将 「loading view 」从父 view 中移除掉,将「原 view」(bind 进来的 view),添加到父 view。
|
|
2.2 对于 RecyclerView
|
|
|
|
与普通 view 不同, recyclerview 的 Skeleton Builder 提供了多个 adapter 方法来设置适配器,count 方法用于设置 列表项数目,frozen 控制 Skeleton 显示期间是否冻结 RecyclerView。
上面的 RecyclerViewSkeletonScreen.Builder#show 方法,首先创建了 一个 RecyclerViewSkeletonScreen ,然后调用它的 show 方法
RecyclerViewSkeletonScreen#RecyclerViewSkeletonScreen
|
|
2.2.1 显示
RecyclerViewSkeletonScreen#show
|
|
2.2.2 隐藏
RecyclerViewSkeletonScreen#hide
|
|
SkeletonAdapter 的实现
|
|
可以看到还是跟普通的 view 一个套路,不闪烁的话,直接将列表项渲染出来就完事。如果设置了闪烁,则需要包装到一个 ShimmerLayout 中,并根据参数进一步设置。
3.总结
普通 view, 核心思想就是,利用 ViewGroup#addView,ViewGroup#removeView 对 view 进行替换。
显示 Skeleton 的时候,将原来的 view 替换为 loadingView
隐藏 Skeleton 的时候,将「loadingview」替换为 sourceView。
对于 RecyclerView,在显示期间,通过 SkeletonAdapter 偷天换日,将 loading 显示出来。
隐藏的时候,将真正的 adapter 设置回去。
4.参考资料与学习资源推荐
由于本人水平有限,可能出于误解或者笔误难免出错,如果发现有问题或者对文中内容存在疑问请在下面评论区告诉我,谢谢!