我在HorizontalScrollView中有一个LinearLayout。内容只是一张图片。在滚动时,我需要实现与在相当于HSW的iPhone上设置分页选项时相同的行为(滚动列表应该停在列表中的每个页面上,而不是继续移动)。
这是如何在Android中完成的?我应该自己实现这个功能,还是要设置特定的属性或HSV的子类来实现?
答案 0 :(得分:20)
我在这里遇到了一个很好的解决方案:
这是在这里找到的代码的清理GitHub版本:
在图像上使用它可能看起来有点过分,但是这个解决方案允许使用一个小技巧进行无限分页(即:在第一页时,您可以滚动回到最后一页,在最后一页上,您可以向前滚动到第一页)。它还允许您拥有未知数量的页面,并使用另一个小技巧动态生成内容。请在第二个链接here
中查看我的评论有关我如何完成此任务的详细信息。
希望这有帮助。
答案 1 :(得分:15)
Android中的新兼容性包(第3版)添加了一个ViewPager,可以实现这一点。
答案 2 :(得分:13)
所以,我的解决方案是:
方法computeScroll被调用以移动列表。默认情况下,我认为它实现了以一定比例减速...... 由于我不想要这个动作,我只是在没有指定身体的情况下覆盖它。
事件处理程序的代码是:
_scrollView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_UP)
{
float currentPosition = _scrollView.getScrollX();
float pagesCount = _horizontalBar.getChildCount();
float pageLengthInPx = _horizontalBar.getMeasuredWidth()/pagesCount;
float currentPage = currentPosition/pageLengthInPx;
Boolean isBehindHalfScreen = currentPage-(int)currentPage > 0.5;
float edgePosition = 0;
if(isBehindHalfScreen)
{
edgePosition = (int)(currentPage+1)*pageLengthInPx;
}
else
{
edgePosition = (int)currentPage*pageLengthInPx;
}
_scrollView.scrollTo((int)edgePosition, 0);
}
return false;
}
});
在我继承的HorizontalScrollView
中@Override
public void computeScroll (){
return;
}
答案 3 :(得分:-1)
我发现了另一种获得相同效果的方法,我认为更具可读性。这是方法:
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_UP)
{
float currentPosition = hsv.getScrollX();
float pagesCount = hsv.getChildCount();
float pageLengthInPx = hsv.getMeasuredWidth()/pagesCount;
int page = (int) (Math.floor((currentPosition - pageLengthInPx / 2) / pageLengthInPx) + 1);
hsv.scrollTo((int) (page * pageLengthInPx), 0);
}
return false;
}