如何同步 ViewPager 与 Horizo​​ntalScrollView 以保持它们一起移动

How to synchronize ViewPager with HorizontalScrollView to keep them moving together

我有一个 ViewPager 和一个 Horizo​​ntalScrollView。我想以编程方式将 Horizo​​ntalScrollView 移动到 ViewPager 的相同位置,所以我会以这种方式运行:当我将 ViewPager 滚动到第 1 页时,Horizo​​ntalScrollView 会自动移动到位置 1。我尝试使用 ViewPager.OnPageChangeListenersmoothScrollTo (int x, int y),但我不明白如何使用最后一种方法:特别是,我不明白在这种情况下 X 和 Y 是什么意思。这里的代码:

public class MyClass extends AppCompatActivity implements ViewPager.OnPageChangeListener {

    ViewPager viewPager;
    HorizontalScrollView hscroll;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ...

        viewPager = (ViewPager) findViewById(R.id.pager);
        hscroll = (HorizontalScrollView) findViewById(R.id.horizontalScrollView);
        viewPager.setOnPageChangeListener(this);

        ...

    }

    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

    }

    @Override
    public void onPageSelected(int position) {
        hscroll.smoothScrollTo(position-1, position);
        Toast.makeText(getApplicationContext(), String.valueOf(position), Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onPageScrollStateChanged(int state) {

    }

有什么想法吗?非常感谢您的帮助,提前致谢:)

我是这样解决的,不够优雅准确,但是很管用。由于我没有找到让 smoothScrollTo 工作的方法,我尝试使用 smoothScrollBy,这与第一个有点不同,因为它将 horizo​​ntalScrollView 滚动一定数量的像素。因此,如果我们知道 horizo​​ntalScrollView 的每个项目的宽度约为 72dp,我们可以通过编程将 dp 转换为像素,最后调用 smoothScrollBy。您还必须保存最后一页的先前位置,以便为滚动 horizo​​ntalScrollView 提供正确的方向。这里我展示了我是如何修改 OnPageSelected 方法的(precPos 是一个初始化为 0 的 Integer):

@Override
    public void onPageSelected(final int position) {
        //hscroll.smoothScrollTo(position, 0);
        hscroll.setSmoothScrollingEnabled(true);

        // convert dp to pixels
        Resources r = getResources();
        float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 72, r.getDisplayMetrics());

        // and found the right direction to scroll
        if (position < precPos) hscroll.smoothScrollBy((int) -px, 0);
        else hscroll.smoothScrollBy((int) px, 0);
        // save the last position
        precPos = position;
}

如果您遇到同样的问题,我希望这对您有所帮助。所以,我是这样解决的,无论如何,如果有人能解释我如何使用smoothScrollTo,不客气:)