如何同步 ViewPager 与 HorizontalScrollView 以保持它们一起移动
How to synchronize ViewPager with HorizontalScrollView to keep them moving together
我有一个 ViewPager 和一个 HorizontalScrollView。我想以编程方式将 HorizontalScrollView 移动到 ViewPager 的相同位置,所以我会以这种方式运行:当我将 ViewPager 滚动到第 1 页时,HorizontalScrollView 会自动移动到位置 1。我尝试使用 ViewPager.OnPageChangeListener
和 smoothScrollTo (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
,这与第一个有点不同,因为它将 horizontalScrollView 滚动一定数量的像素。因此,如果我们知道 horizontalScrollView 的每个项目的宽度约为 72dp
,我们可以通过编程将 dp 转换为像素,最后调用 smoothScrollBy
。您还必须保存最后一页的先前位置,以便为滚动 horizontalScrollView 提供正确的方向。这里我展示了我是如何修改 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
,不客气:)
我有一个 ViewPager 和一个 HorizontalScrollView。我想以编程方式将 HorizontalScrollView 移动到 ViewPager 的相同位置,所以我会以这种方式运行:当我将 ViewPager 滚动到第 1 页时,HorizontalScrollView 会自动移动到位置 1。我尝试使用 ViewPager.OnPageChangeListener
和 smoothScrollTo (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
,这与第一个有点不同,因为它将 horizontalScrollView 滚动一定数量的像素。因此,如果我们知道 horizontalScrollView 的每个项目的宽度约为 72dp
,我们可以通过编程将 dp 转换为像素,最后调用 smoothScrollBy
。您还必须保存最后一页的先前位置,以便为滚动 horizontalScrollView 提供正确的方向。这里我展示了我是如何修改 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
,不客气:)