我有以下问题。我在HorizontalScrollView中放置了30多张图像。我正在通过在HorizontalScrollView中重写此方法来正确检测onScroll()。问题是我只需要加载用户所在的那些图像,或者会有太多下载/内存等等。所以如果用户现在快速滚动,它会开始下载从滚动开始到滚动结束的所有内容。这可能是一百张图像,但在滚动结束时,它们只是说4或5张图像。如何检测滚动停止?并用它来开始下载?
编辑:对于慢速滚动,它工作得很完美,但快速滚动是问题所在。如果滚动速度慢,那么行为就很完美。
编辑:我正在做的是更新onScroll附近的任何图像但是onScroll似乎被多次调用,并且很难确定是否应该从onScroll内部更新图像。例如,x = 50,xPrev = 49,xPrev = 50,x = 51等,实际上每个像素的变化都会调用onScroll。
由于
答案 0 :(得分:1)
您的图像在水平方向移动, 你需要做的是找到运动图像的速度,并根据它加载图像或跳过它们, 在onScrollChanged方法中获取当前时间将其保存到变量并找到与旧时间的差异,如果距离即水平x1和x2的差异大于某个水平,例如屏幕宽度(用它进行试验),则在速度低于此时计算速度某些级别加载图像或以其他方式忽略,总是在空闲时加载图像,即当速度为零时。
答案 1 :(得分:0)
无论如何都没有找到检测滚动结束但使用CountDownTimer似乎有效:
我还需要覆盖HorizontalScrollView以添加一个回调IHorizontalScrollListener,它在HorizontalScrollView的onScrollView中调用。 viewGroupContainer是ImageViews的容器LinearLayout。滚动视图只能直接包含一个ViewGroup,因此我将所有图像添加到视图组。 CountDownTimer是活动中维护的参考。
hzScrollView.setScrollListener(new IHorizontalScrollListener(){
@Override
public void onScrollChanged(int l, int t, int oldl, int oldt) {
Log.i(TAG, "onScrollChanged to x="+l+" y="+t);
Log.i(TAG, "onScrollChanged from x="+oldl+ " y="+oldt);
if (scrollUpdateTimer == null)
{
scrollUpdateTimer = new CountDownTimer(30000, 1000){
@Override
public void onFinish() {
scrollUpdateTimerRunning = false;
}
@Override
public void onTick(long interval) {
Log.d(TAG, "onTick updateImageViews");
updateImageViews(hZScrollView, viewGroupContainer);
}};
}
if (scrollUpdateTimerRunning == false)
{
scrollUpdateTimerRunning = true;
scrollUpdateTimer.start();
}
}});
}