热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Github学习之RecyclerView实现View滑动折叠效果

今天在Github上看了一篇通过RecyclerView实现喵街首页View滑动折叠效果,感觉博主很厉害,就记下学习之。效果图实现:结构图:添加依赖:dependencies{

今天在Github上看了一篇通过RecyclerView实现喵街首页View滑动折叠效果,感觉博主很厉害,就记下学习之。

效果图

这里写图片描述

实现:

结构图:
这里写图片描述

添加依赖:

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


推荐阅读
author-avatar
关于快乐的秘密_473
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有