两个同步滚动型 [英] Sync Two ScrollView
问题描述
情况:
我有两个滚动型每两个HorizontalScrollView通过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屋!