android - 同步 ScrollView 滚动位置 - android

我的 android 布局中有 2 个 ScrollView。如何同步他们的滚动位置?

最佳答案

ScrollView中有一个方法...

protected void onScrollChanged(int x, int y, int oldx, int oldy)

不幸的是,Google 从未想过我们需要访问它,这就是为什么他们将其设为 protected 并且没有添加“setOnScrollChangedListener” Hook 的原因。所以我们必须自己做。

首先我们需要一个接口(interface)。

package com.test;

public interface ScrollViewListener {

    void onScrollChanged(ObservableScrollView scrollView, int x, int y, int oldx, int oldy);

}

然后我们需要重写 ScrollView 类,提供 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 标签。

<com.test.ObservableScrollView
    android:id="@+id/scrollview1"
    ... >

    ...

</com.test.ObservableScrollView>

最后,我们将它们放在 Layout 类中。

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 版本中有效,因为我们覆盖了一个 protected 方法。

https://stackoverflow.com/questions/3948934/

相关文章:

android - 如何将值从一个 Activity 传递到上一个 Activity

android - ViewPager.setOffscreenPageLimit(0) 无法按预期

android - 如何检查 Activity 是在前台还是在可见背景中?

android - 无法修改 ListView 中的 ArrayAdapter : Unsuppor

android - 获取 backstack 中的最新 fragment

android - 如何检测Android中布局的方向变化?

android - 清算 Intent

android - 带有阴影的自定义 ImageView

android - SearchView 的 OnCloseListener 不起作用

android - 带有完成操作按钮的多行 EditText