我有一个 LinearLayout 放在 HorizontalScrollView 里,内容只是一张图片。当滑动时,我需要实现与 iPhone 上的 HSW 的分页选项相同的行为(滚动列表应停在列表中的每一页,而不是继续移动)。
在 Android 中如何实现这个功能?我应该自己实现这个特性还是有特定的属性或者 HSV 的子类可以实现?
我有一个 LinearLayout 放在 HorizontalScrollView 里,内容只是一张图片。当滑动时,我需要实现与 iPhone 上的 HSW 的分页选项相同的行为(滚动列表应停在列表中的每一页,而不是继续移动)。
在 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;
}