同步 ScrollView 滚动位置 - android [英] Synchronise ScrollView scroll positions - android
问题描述
我的 android 布局中有 2 个 ScrollView.如何同步它们的滚动位置?
I have 2 ScrollViews in my android layout. How can I synchronise their scroll positions?
推荐答案
ScrollView中有一个方法...
There is a method in ScrollView...
protected void onScrollChanged(int x, int y, int oldx, int oldy)
不幸的是,Google 从未想过我们需要访问它,这就是为什么他们将它保护起来并且没有添加setOnScrollChangedListener"钩子的原因.所以我们必须自己做.
Unfortunately Google never thought that we would need to access it, which is why they made it protected and didn't add a "setOnScrollChangedListener" hook. So we will have to do that for ourselves.
首先我们需要一个接口.
First we need an interface.
package com.test;
public interface ScrollViewListener {
void onScrollChanged(ObservableScrollView scrollView, int x, int y, int oldx, int oldy);
}
然后我们需要重写 ScrollView 类,提供 ScrollViewListener 钩子.
Then we need to override the ScrollView class, to provide the ScrollViewListener hook.
package com.test;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.ScrollView;
public class ObservableScrollView extends ScrollView {
private ScrollViewListener scrollViewListener = null;
public ObservableScrollView(Context context) {
super(context);
}
public ObservableScrollView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public ObservableScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public void setScrollViewListener(ScrollViewListener scrollViewListener) {
this.scrollViewListener = scrollViewListener;
}
@Override
protected void onScrollChanged(int x, int y, int oldx, int oldy) {
super.onScrollChanged(x, y, oldx, oldy);
if(scrollViewListener != null) {
scrollViewListener.onScrollChanged(this, x, y, oldx, oldy);
}
}
}
我们应该在布局中指定这个新的 ObservableScrollView 类,而不是现有的 ScrollView 标签.
And we should specify this new ObservableScrollView class in the layout, instead of the existing ScrollView tags.
<com.test.ObservableScrollView
android:id="@+id/scrollview1"
... >
...
</com.test.ObservableScrollView>
最后,我们将它们全部放在 Layout 类中.
Finally, we put it all together in the Layout class.
package com.test;
import android.app.Activity;
import android.os.Bundle;
public class Q3948934 extends Activity implements ScrollViewListener {
private ObservableScrollView scrollView1 = null;
private ObservableScrollView scrollView2 = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.q3948934);
scrollView1 = (ObservableScrollView) findViewById(R.id.scrollview1);
scrollView1.setScrollViewListener(this);
scrollView2 = (ObservableScrollView) findViewById(R.id.scrollview2);
scrollView2.setScrollViewListener(this);
}
public void onScrollChanged(ObservableScrollView scrollView, int x, int y, int oldx, int oldy) {
if(scrollView == scrollView1) {
scrollView2.scrollTo(x, y);
} else if(scrollView == scrollView2) {
scrollView1.scrollTo(x, y);
}
}
}
scrollTo() 代码为我们处理任何循环条件,因此我们无需担心.唯一需要注意的是,此解决方案不能保证在未来的 Android 版本中有效,因为我们正在覆盖受保护的方法.
The scrollTo() code takes care of any loop conditions for us, so we don't need to worry about that. The only caveat is that this solution is not guaranteed to work in future versions of Android, because we are overriding a protected method.
这篇关于同步 ScrollView 滚动位置 - android的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!