我在 HorizontalScrollView 中有一个 LinearLayout。内容只是一个图像。滚动时,我需要实现与在相当于 HSW 的 iPhone 上设置分页选项时获得的相同行为(滚动列表应停止在列表中的每一页,而不是继续移动)。
这在 Android 中是如何完成的?我应该自己实现此功能还是需要设置特定属性或 HSV 子类来实现?
所以,我的解决方案是:
调用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;
}
Android 中新的兼容性包(修订版 3)添加了一个 ViewPager 来执行此操作。
我找到了另一种方法来获得相同的效果,并且我认为更具可读性。方法如下:
@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;
}