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);
}

相关文章

ADB Remote ATV Android TV 的遥控器,基于 ADB Shell 命令 ...
使用Flutter自带的SearchDelegate组件实现搜索界面,通过魔改...
上篇文章讲解了怎么使用Kotlin的协程配合Retrofit发起网络请...
安卓开发——WebView+Recyclerview文章详情页,解决高度...
Android 如何解决dialog弹出时无法捕捉Activity的back事件 在...