微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

android – 同步两个ScrollView

情况:
我在TableRow的两个Horizo​​ntalScrollView中分别有两个ScrollView.

目标:
当我触摸拖动其中一个ScrollView时,另一个ScrollView必须滚动尽可能多.例如,如果我在左侧ScrollView上有一个名称列表,并且右侧ScrollView中有相应的电话号码,则滚动一个ScrollView不应该破坏名称和电话号码之间的原始界限.

可以通过onTouchEvent实现吗?如果是这样,我应该如何实现它(在两个或一个ScrollView上)?

请帮帮我安卓大师!

解决方法

我有一个适合我的简单解决方案:

>滚动ScrollViews并覆盖其onScrollChanged事件以在滚动更改时更新ScrollManager:

public interface ScrollNotifier {   
    public void setScrollListener(ScrollListener scrollListener);

    public ScrollListener getScrollListener();
}

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,oldt);
    }
    @Override
    public void setScrollListener(ScrollListener scrollListener) {
        this.scrollListener = scrollListener;
    }
    @Override
    public ScrollListener getScrollListener() {
        return scrollListener;
    }
}

>创建一个ScrollManager类,用于协调多个参与者的滚动

public interface ScrollListener {
    void onScrollChanged(View syncedScrollView,int l,int oldt);
}

public class ScrollManager implements ScrollListener {
    private static final int SCROLL_HORIZONTAL = 1;
    private static final int SCROLL_VERTICAL = 2;

    private ArrayList<ScrollNotifier> clients = new ArrayList<ScrollNotifier>(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 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
            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;
    }
}

>创建自定义ScrollViews并在两者上设置ScrollManager以进行通知

private void setupScrolling() {
    ScrollNotifier view;
    ScrollManager scrollManager = new ScrollManager();

    // timeline horizontal scroller
    view = (ScrollNotifier) findViewById(R.id.epgtimeline_container);
    scrollManager.addScrollClient(view);

    // services vertical scroller
    view = (ScrollNotifier) findViewById(R.id.epgservices_container);
    scrollManager.addScrollClient(view);

    // content area scrollers
    view = (ScrollNotifier) findViewById(R.id.epgevents_container_inner);
    scrollManager.addScrollClient(view);
    view = (ScrollNotifier) findViewById(R.id.epgevents_container_outer);
    scrollManager.addScrollClient(view);
}

原文地址:https://www.jb51.cc/android/316676.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐