Android 如何实现多个TextView同时同步横向滚动?
ListView多TextView同步横向滚动实现方案
核心实现逻辑
通过监听单个TextView的滚动事件,实时同步其余两个TextView的水平滚动偏移量即可,实现成本很低,不需要自定义控件:
- 首先给三个TextView都开启横向滚动支持
- 给每个TextView绑定滚动监听器,滚动时同步其余两个的scrollX值
- 加状态标记位避免滚动事件循环触发
具体实现步骤
- 布局中给TextView配置基础属性
<TextView android:id="@+id/tv1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:singleLine="true" android:scrollHorizontally="true" /> <!-- 另外两个TextView配置一致,分别设id为tv2、tv3 -->
- 在ListView的Adapter的
getView方法中绑定同步逻辑
// 每个item内声明标记位,避免滚动循环触发 AtomicBoolean isSyncing = new AtomicBoolean(false); TextView tv1 = convertView.findViewById(R.id.tv1); TextView tv2 = convertView.findViewById(R.id.tv2); TextView tv3 = convertView.findViewById(R.id.tv3); // 统一设置滚动支持 tv1.setMovementMethod(new ScrollingMovementMethod()); tv2.setMovementMethod(new ScrollingMovementMethod()); tv3.setMovementMethod(new ScrollingMovementMethod()); // 统一滚动监听器 View.OnScrollChangeListener scrollListener = (v, scrollX, scrollY, oldScrollX, oldScrollY) -> { if (isSyncing.get()) return; isSyncing.set(true); // 同步其余两个TextView的滚动偏移 if (v != tv1) tv1.scrollTo(scrollX, scrollY); if (v != tv2) tv2.scrollTo(scrollX, scrollY); if (v != tv3) tv3.scrollTo(scrollX, scrollY); isSyncing.set(false); }; // 绑定监听器 tv1.setOnScrollChangeListener(scrollListener); tv2.setOnScrollChangeListener(scrollListener); tv3.setOnScrollChangeListener(scrollListener);
兼容低版本方案
如果需要兼容API 23以下的系统,可以用ViewTreeObserver.OnScrollChangedListener替代OnScrollChangeListener,逻辑完全一致,只需要把监听的注册方式改成对应的ViewTreeObserver API即可。
内容的提问来源于stack exchange,提问作者idrkwhatsgoingon
相关产品推荐
相关产品推荐

