分享一个两个Android(安卓)scrollView同时滚动的方法
16lz
2021-12-04
public interface ScrollNotifier { public void setScrollListener(ScrollListener scrollListener); public ScrollListener getScrollListener();}public interface ScrollListener { void onScrollChanged(View syncedScrollView, int l, int t, int oldl, int oldt);} public class SyncedScrollView extends ScrollView implements ScrollNotifier { //... private ScrollListener scrollListener = null; @Override protected void onScrollChanged(int l, int t, int oldl, int oldt) { super.onScrollChanged(l, t, oldl, oldt); if (scrollListener != null) scrollListener.onScrollChanged(this, l, t, oldl, oldt); } @Override public void setScrollListener(ScrollListener scrollListener) { this.scrollListener = scrollListener; } @Override public ScrollListener getScrollListener() { return scrollListener; } }**最关键的是在下面创建一个Manager,判断scroll滚动**public class ScrollManager implements ScrollListener { private static final int SCROLL_HORIZONTAL = 1; private static final int SCROLL_VERTICAL = 2; private ArrayList clients = new ArrayList(4); private volatile boolean isSyncing = false; private int scrollType = SCROLL_HORIZONTAL; public void addScrollClient(ScrollNotifier client) { clients.add(client); client.setScrollListener(this); } // TODO fix dependency on all views being of equal horizontal/ vertical // dimensions @Override public void onScrollChanged(View sender, int l, int t, int oldl, int oldt) { // avoid notifications while scroll bars are being synchronized if (isSyncing) return; isSyncing = true; // remember scroll type if (l != oldl) scrollType = SCROLL_HORIZONTAL; else if (t != oldt) scrollType = SCROLL_VERTICAL; else { // not sure why this should happen isSyncing = false; return; } // update clients for (ScrollNotifier client : clients) { View view = (View) client; // don't update sender if (view == sender) continue; // scroll relevant views only // TODO Add support for horizontal ListViews - currently weird things happen when ListView is being scrolled horizontally //这里判断了是否是scrollView、HorizontalScrollView、ListView,所以想要ListView或者HorizontalScrollView同时滚动亦可如此;方法类似 if ((scrollType == SCROLL_HORIZONTAL && view instanceof HorizontalScrollView) || (scrollType == SCROLL_VERTICAL && view instanceof ScrollView) || (scrollType == SCROLL_VERTICAL && view instanceof ListView)) view.scrollTo(l, t); } isSyncing = false; }}最后在activity里调用的方法如下 private void setupScrolling() { SyncedScrollView view; ScrollManager scrollManager = new ScrollManager(); // timeline horizontal scroller view = (SyncedScrollView) findViewById(R.id.epgtimeline_container); scrollManager.addScrollClient(view); // services vertical scroller view = (SyncedScrollView) findViewById(R.id.epgservices_container); scrollManager.addScrollClient(view); // content area scrollers view = (SyncedScrollView) findViewById(R.id.epgevents_container_inner); scrollManager.addScrollClient(view); view = (SyncedScrollView) findViewById(R.id.epgevents_container_outer); scrollManager.addScrollClient(view); }
更多相关文章
- ConnectivityManager判断当前用的是什么网络
- Android全面屏手机判断NavigationBar是否可见
- android 断点续传类
- android GestureDetector 手势的判断
- android 流布局自动换行和居中
- Android(安卓)调用.NET webservice
- Android判断当前网络类型是否为5G
- Android(安卓)浏览网页
- Android(安卓)浅析 ContentProvider (一) 使用