来源: APP开发-无心懒猪
实现构想
现在我们项目使用的骨架屏幕在列表页面和商品详细信息页面上,所以我的项目把骨架屏幕分为两个模块。 一种情况是预加载到多个view (如list ),另一种情况是需要预加载到包含一个页面的view。
列表部分
安卓端通常使用RecyclerView Adapter ViewHolder来实现列表加载视图。 Adapter用作适配器,以适当的格式在RecyclerView中显示各种数据。 最初的想法包括以下内容。
通过直接对原始布局进行修改,将骨架屏幕布局布置在当前布局的上层,控制可见性来实现
这样实现和业务的耦合性太强,现有的代码和逻辑变更很大,风险也太大了
创建新的骨架屏幕ViewHolder,重写骨架屏幕item的布局,通过判断加载完成来控制绑定ViewHolder,在加载完成后无法加载骨架屏幕的ViewHolder
缺点:和直接改变布局一样,以前的逻辑和代码会工作很多
新的骨架屏幕在Adapter中是通用的,加载数据时使用骨架屏幕Adapter,加载完成后替换为普通的Adapter
我们需要用最低的成本,在现有的基础上增加骨架屏幕,所以我选择了在adapter上做文章。 这样,在分离业务和骨架屏幕代码的同时,就不需要编写大量判断的代码。
单个视图部分
安装的思路是,获取替换部分的ViewA,获取他的父类的ViewGroup,从父类中删除ViewA,将框架画面的ViewB添加到ViewA的位置,加载结束后删除ViewB,添加ViewA
#具体实现
画了一个大概的类图:
核心代码
RecyclerViewSkeleton.kt
override fun show (
skeleton adapter.is grid=display mode==grid _ mode
recyclerView? let {
valgridlayoutmanager=gridlayoutmanagerwrapper (it.context,2 ) )。
gridlayout manager.orientation=linearlayoutmanager.vertical
recyclerView? layout manager=if (display mode==grid _ mode )网格layoutmanagerelselinearlayoutmanager (it.context ) )。
recyclerView? adapter=skeletonAdapter
}
}
overridefunhide(}
接收视图(if )? adapter=mActualAdapter ) {
recyclerView? adapter=mActualAdapter
}
}
复制代码
ViewSkeleton.kt
override fun show (
根视图? let {
if(it.Parent!=空) {
parent view=(it.parentasviewgroup ) )。
shimmerviewids.is not empty () ) }
精简向导(for ) {
initshimmerlayout(targetview? findviewbyid(shimmerviewid ) )
}
}
val index=parentView? indexofchild(it )? -1
if (索引!=-1({
parentView? removeview(it ) )。
parentView? addview(targetview,index ) )。
}
}
}
}
overridefunhide(}
val index=parentView? indexofchild(targetview )? -1
if (索引!=-1({
parentView? removeview(targetview ) )。
parentView? addview(rootview,index ) )。
}
}
复制代码
项目中的运用
主要用于v2/ProductActivity.kt和SearchResultActivity.kt
闪光动画部分
动画的第三方库ShimmerLayout的一部分可以设置闪光灯的颜色、角度和动画持续时间等功能。 可以通过startShimmerAnimation (和stopShimmerAnimation )控制动画的开始和结束,从而基本满足当前产品设计的需要。 省略详细内容。
shimmer layout.setshimmercolor (color.argb ) 178、255、255和255 ) )
shimmer layout.setshimmerangle (30 ) )。
shimmer layout.setshimmeranimationduration (1500 ) )。
shimmer layout.startshimmeranimation (
复制代码