分享一个两个Android scrollView同时滚动的方法

来源:互联网 发布:永乐大帝 知乎 编辑:程序博客网 时间:2024/06/05 21:57
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);    }
0 0
原创粉丝点击