两个同步滚动型 [英] Sync Two ScrollView

查看:135
本文介绍了两个同步滚动型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

情况: 我有两个滚动型每两个Horizo​​ntalScrollView通过tablerow的内部。

目标: 当我触摸拖动滚动型中的一个,另一个滚动型必须滚动之多。例如,如果我有对应的电话号码在右滚动型,滚动1滚动型不应破坏姓名和电话号码之间的原始边界上向左滚动型名称和列表。

Situation: I have two ScrollView inside of each of two HorizontalScrollView of a TableRow.

Goal: When I touch drag one of ScrollView, another ScrollView must scroll as much. For instance, if I have a list of name on left ScrollView and corresponding phone numbers in right ScrollView, scrolling one ScrollView should not destroy the original bounding between the names and phone numbers.

可不可以这样通过的onTouchEvent实施?如果是这样,我应该如何实现这个(在两个或滚动型之一)?

Can it be implemented by onTouchEvent? If so, how should I implement this(on both or one of the ScrollView)?

请帮我出Android的大师!

Please help me out Android Gurus!

推荐答案

我有一个简单的解决方案,为我的作品:

I have a simple solution that works for me:

  • 在子类均ScrollViews和覆盖其onScollChanged事件以滚动更改时更新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, t, oldl, 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 t, int oldl,
                int oldt);
    
    }
    
    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
                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);
          }
      

      这篇关于两个同步滚动型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆