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

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值