当前位置: 首页 > news >正文

tablayout 滚动模式_scrollview+tablayout实现联动

一、需求:

项目开发中的需求,需要scrollview和tablayout实现联动:

1、点击tablayout的tab,scrollview滑动到指定的位置

2、scrollview滑动到某位置时tablayout切换到对应的tab

效果如下:

效果.gif

二、开始撸代码

布局文件:

xmlns:app="http://schemas.android.com/apk/res-auto"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical">

android:id="@+id/tabLayout"

android:layout_width="match_parent"

android:layout_height="50dp"

app:tabIndicatorColor="@color/colorPrimary"

app:tabMode="fixed"

app:tabSelectedTextColor="@color/colorPrimary"

app:tabTextColor="@android:color/black">

android:id="@+id/tab1"

android:layout_width="wrap_content"

android:layout_height="match_parent"

android:text="按钮1" />

android:id="@+id/tab2"

android:layout_width="wrap_content"

android:layout_height="match_parent"

android:text="按钮2" />

android:id="@+id/tab3"

android:layout_width="wrap_content"

android:layout_height="match_parent"

android:text="按钮3" />

android:id="@+id/scrollView"

android:layout_width="match_parent"

android:layout_height="match_parent">

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:orientation="vertical">

android:id="@+id/tv1"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="我是按钮1" />

android:layout_width="match_parent"

android:layout_height="800dp"

android:background="@android:color/holo_blue_dark" />

android:id="@+id/tv2"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="我是按钮2" />

android:layout_width="match_parent"

android:layout_height="800dp"

android:background="@android:color/holo_green_light" />

android:id="@+id/tv3"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="我是按钮3" />

android:layout_width="match_parent"

android:layout_height="800dp"

android:background="@android:color/holo_red_dark" />

java:

private int tabIndex = 0;//tablayout所处的下标

private boolean scrollviewFlag = false;//标记是否是scrollview在滑动

tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {

@Override

public void onTabSelected(TabLayout.Tab tab) {

if (!scrollviewFlag) {

switch (tab.getPosition()) {

case 0://scrollview移动到tv1的顶部坐标处

scrollView.scrollTo(0, tv1.getTop());

break;

case 1://scrollview移动到tv2的顶部坐标处

scrollView.scrollTo(0, tv2.getTop());

break;

case 2://scrollview移动到tv3的顶部坐标处

scrollView.scrollTo(0, tv3.getTop());

break;

}

}

//用户点击tablayout时,标记不是scrollview主动滑动

scrollviewFlag = false;

}

@Override

public void onTabUnselected(TabLayout.Tab tab) {

}

@Override

public void onTabReselected(TabLayout.Tab tab) {

}

});

//scrollview滑动事件监听

scrollView.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {

@Override

public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {

scrollviewFlag = true;

tabIndex = tabLayout.getSelectedTabPosition();

if (scrollY < tv2.getTop()) {

if (tabIndex != 0) {//增加判断,如果滑动的区域是tableIndex=0对应的区域,则不改变tablayout的状态

tabLayout.selectTab(tabLayout.getTabAt(0));

}

} else if (scrollY >= tv2.getTop() && scrollY < tv3.getTop()) {

if (tabIndex != 1) {

tabLayout.selectTab(tabLayout.getTabAt(1));

}

} else if (scrollY >= tv3.getTop()) {

if (tabIndex != 2) {

tabLayout.selectTab(tabLayout.getTabAt(2));

}

}

scrollviewFlag = false;

}

});

大概逻辑在代码的注解上

注:仅以记录学习使用,如有错误,欢迎指出,互相学习

相关文章:

  • cboard企业版源码_数据可视化BI平台——CBoard的部署与使用(笔记整理)
  • 生活中的算法的实际举例_生活中的算法
  • pyecharts 绘制三维散点图_pyecharts
  • toolbar文本在最右侧_Toolbar中Menu的背景颜色、位置、同时显示文字等设置(亲测)...
  • linux 使用imageio.read 读图片出来为null_经典Linux面试题
  • gifcam使用缩小内存_GifCam怎么用?GifCam使用教程
  • openkruise 缩容_Kubernetes应用管理器OpenKruise
  • arduino as5048工作原理_Arduino 真的可以用来开发产品吗?分享一个电子工程师的Arduino使用心得分享!...
  • jquery 多个文本框赋值_jquery为input赋值方法总结
  • nslookup 包含在那个包中_nslookup详解(name server lookup)( 域名查询)
  • double 去掉小数点_怎么去掉double后面的零0及取得double的小数部分的有效位 | 学步园...
  • 对一个字段赋值默认值_Java入门基础学习,成为一个Java程序员的必备知识
  • adb 重命名_adb无法连接设备?只需要这五步就能解决
  • sklearn中lstm_LSTM的时序应用
  • python中字符串之间的比较_【python】比较字符串中不同的地方
  • 【React系列】如何构建React应用程序
  • 【翻译】babel对TC39装饰器草案的实现
  • 10个确保微服务与容器安全的最佳实践
  • docker python 配置
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • JavaScript中的对象个人分享
  • Markdown 语法简单说明
  • React组件设计模式(一)
  • Shadow DOM 内部构造及如何构建独立组件
  • SQLServer插入数据
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 两列自适应布局方案整理
  • 用Canvas画一棵二叉树
  • linux 淘宝开源监控工具tsar
  • ​力扣解法汇总946-验证栈序列
  • #Ubuntu(修改root信息)
  • $L^p$ 调和函数恒为零
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (k8s中)docker netty OOM问题记录
  • (办公)springboot配置aop处理请求.
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .NET 读取 JSON格式的数据
  • .NET简谈设计模式之(单件模式)
  • @ConditionalOnProperty注解使用说明
  • @Mapper作用
  • @param注解什么意思_9000字,通俗易懂的讲解下Java注解
  • @四年级家长,这条香港优才计划+华侨生联考捷径,一定要看!
  • [C++] 统计程序耗时
  • [Jenkins] Docker 安装Jenkins及迁移流程