作者:关于快乐的秘密_473 | 来源:互联网 | 2023-05-27 16:56
今天在Github上看了一篇通过RecyclerView实现喵街首页View滑动折叠效果,感觉博主很厉害,就记下学习之。效果图实现:结构图:添加依赖:dependencies{
今天在Github上看了一篇通过RecyclerView实现喵街首页View滑动折叠效果,感觉博主很厉害,就记下学习之。
效果图
![这里写图片描述](https://www.#.com/go/aHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2RvbmdqdW5rdW4vbWlhb2ppZWRlbW8vbWFzdGVyL2FydC9tb2NrbWlhb2ppZS5naWY=)
实现:
结构图:
![这里写图片描述](https://www.#.com/go/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYwNTEyMjMxNzU3NjMw)
添加依赖:
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:recyclerview-v7:23.1.1'
compile 'com.github.bumptech.glide:glide:3.6.1'
}
主体由recyclerview+Glide实现。
由于需要动态设置item高度,透明度,字体大小
item_max_height = (int) getResources().getDimension(R.dimen.item_max_height)
item_normal_height = (int) getResources().getDimension(R.dimen.item_normal_height)
item_normal_font_size = getResources().getDimension(R.dimen.item_normal_font_size)
item_max_font_size = getResources().getDimension(R.dimen.item_max_font_size)
item_normal_alpha = getResources().getFraction(R.fraction.item_normal_mask_alpha, 1, 1)
item_max_alpha = getResources().getFraction(R.fraction.item_max_mask_alpha, 1, 1)
font_size_d = item_max_font_size - item_normal_font_size
alpha_d = item_max_alpha - item_normal_alpha
这里作者定义了分别定义了最大高度,正常高度,最大字体,正常字体,最大透明度值,正常透明度值。
MyAdapter myAdapter = new MyAdapter(this, walls);
利用MyAdapter传递数据,并显示。
HeaderAndFooterRecyclerViewAdapter headerAndFooterRecyclerViewAdapter = new HeaderAndFooterRecyclerViewAdapter(myAdapter)
recyclerView.setAdapter(headerAndFooterRecyclerViewAdapter)
View moreView = getLayoutInflater().inflate(R.layout.footer_more, null)
TextView more = (TextView) moreView.findViewById(R.id.more)
more.getLayoutParams().height = DeviceUtils.getScreenHeight(this) -
item_max_height
RecyclerViewUtils.setFooterView(recyclerView, moreView)
利用HeaderAndFooterRecyclerViewAdapter添加底部View,RecyclerViewUtils设置顶部或者底部view的工具类。
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy)
LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager()
RecyclerView.ViewHolder firstViewHolder = recyclerView
.findViewHolderForLayoutPosition(linearLayoutManager.findFirstVisibleItemPosition())
RecyclerView.ViewHolder secOndViewHolder= recyclerView
.findViewHolderForLayoutPosition(linearLayoutManager.findFirstCompletelyVisibleItemPosition())
RecyclerView.ViewHolder threeViewHolder = recyclerView
.findViewHolderForLayoutPosition(linearLayoutManager.findFirstCompletelyVisibleItemPosition() + 1)
RecyclerView.ViewHolder lastViewHolder = recyclerView
.findViewHolderForLayoutPosition(linearLayoutManager.findLastVisibleItemPosition())
if (firstViewHolder != null && firstViewHolder instanceof MyAdapter.ViewHolder) {
MyAdapter.ViewHolder viewHolder = (MyAdapter.ViewHolder) firstViewHolder
if (viewHolder.itemView.getLayoutParams().height - dy <= item_max_height
&& viewHolder.itemView.getLayoutParams().height - dy >= item_normal_height) {
viewHolder.itemView.getLayoutParams().height = viewHolder.itemView.getLayoutParams().height - dy
viewHolder.mark.setAlpha(viewHolder.mark.getAlpha() - dy * alpha_d / item_normal_height)
viewHolder.text.setTextSize(TypedValue.COMPLEX_UNIT_PX,
viewHolder.text.getTextSize() - dy * font_size_d / item_normal_height)
viewHolder.itemView.setLayoutParams(viewHolder.itemView.getLayoutParams())
}
}
if (secondViewHolder != null && secondViewHolder instanceof MyAdapter.ViewHolder) {
MyAdapter.ViewHolder viewHolder = (MyAdapter.ViewHolder) secondViewHolder
if (viewHolder.itemView.getLayoutParams().height + dy <= item_max_height
&& viewHolder.itemView.getLayoutParams().height + dy >= item_normal_height) {
viewHolder.itemView.getLayoutParams().height = viewHolder.itemView.getLayoutParams().height + dy
viewHolder.mark.setAlpha(viewHolder.mark.getAlpha() + dy * alpha_d / item_normal_height)
viewHolder.text.setTextSize(TypedValue.COMPLEX_UNIT_PX,
viewHolder.text.getTextSize() + dy * font_size_d / item_normal_height)
viewHolder.itemView.setLayoutParams(viewHolder.itemView.getLayoutParams())
}
}
if (threeViewHolder != null && threeViewHolder instanceof MyAdapter.ViewHolder) {
MyAdapter.ViewHolder viewHolder = (MyAdapter.ViewHolder) threeViewHolder
viewHolder.mark.setAlpha(item_normal_alpha)
viewHolder.text.setTextSize(TypedValue.COMPLEX_UNIT_PX, item_normal_font_size)
viewHolder.itemView.getLayoutParams().height = item_normal_height
viewHolder.itemView.setLayoutParams(viewHolder.itemView.getLayoutParams())
}
if (lastViewHolder != null && lastViewHolder instanceof MyAdapter.ViewHolder) {
MyAdapter.ViewHolder viewHolder = (MyAdapter.ViewHolder) lastViewHolder
viewHolder.mark.setAlpha(item_normal_alpha)
viewHolder.text.setTextSize(TypedValue.COMPLEX_UNIT_PX, item_normal_font_size)
viewHolder.itemView.getLayoutParams().height = item_normal_height
viewHolder.itemView.setLayoutParams(viewHolder.itemView.getLayoutParams())
}
}
})
这里利用recylerview的addOnScrollListener监听器,监听y轴滑动距离dy ,并根据dy动态设置字体大小,item高度。
github地址
https://github.com/dongjunkun/miaojiedemo