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);
}
@Override
public void onScrollChanged(View sender, int l, int t, int oldl, int oldt) {
if (isSyncing)
return;
isSyncing = true;
if (l != oldl)
scrollType = SCROLL_HORIZONTAL;
else if (t != oldt)
scrollType = SCROLL_VERTICAL;
else {
isSyncing = false;
return;
}
for (ScrollNotifier client : clients) {
View view = (View) client;
if (view == sender)
continue;
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();
view = (SyncedScrollView) findViewById(R.id.epgtimeline_container);
scrollManager.addScrollClient(view);
view = (SyncedScrollView) findViewById(R.id.epgservices_container);
scrollManager.addScrollClient(view);
view = (SyncedScrollView) findViewById(R.id.epgevents_container_inner);
scrollManager.addScrollClient(view);
view = (SyncedScrollView) findViewById(R.id.epgevents_container_outer);
scrollManager.addScrollClient(view);
}