首页 > 编程知识 正文

骨骼动画原理,网页骨架屏

时间:2023-05-03 20:53:33 阅读:107167 作者:3408

来源: 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 (

复制代码

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。