Android:控制平滑滚动浏览回收站视图 [英] Android : Control Smooth scroll over recycler view
问题描述
我正在将Recyclerview与CardView一起使用.我知道如何控制列表视图的速度.但是对于Recyclerview来说不是.
I am using Recyclerview with CardView. I am aware how to control speed on list view. But not for Recyclerview.
我在找到的类名称 SmoothScroll <中进行了大量搜索/a>.如何使用?我不知道!现在,默认情况下,Recyclerview的滚动速度很快.
I searched a lot in found class name SmoothScroll. How to use that? I have no Idea! Right now Recyclerview by default scroll is fast.
更新:
我用此
推荐答案
目前尚不清楚您说"smoothScroll
"是什么意思.您可能指的是自动"smoothScrollToPosition
",它将自动滚动到指定位置,您可能正在谈论手动滚动,您可能正在谈论猛冲.为了繁荣,我现在将尝试回答所有这些问题.
It's unclear what you mean when you say "smoothScroll
". You could be referring to the automatic "smoothScrollToPosition
" which will automatically scroll to a specified position, you could be talking about manual scrolling and you could be talking about flinging. For the sake of prosperity, I will attempt to answer all of these issues now.
1.自动平滑滚动.
在布局管理器内部,您需要实现smoothScrollToPosition
方法:
Inside your layout manager, you need to implement the smoothScrollToPosition
method:
@Override
public void smoothScrollToPosition(RecyclerView recyclerView, State state, int position)
{
// A good idea would be to create this instance in some initialization method, and just set the target position in this method.
LinearSmoothScroller smoothScroller = new LinearSmoothScroller(getContext())
{
@Override
public PointF computeScrollVectorForPosition(int targetPosition)
{
int yDelta = calculateCurrentDistanceToPosition(targetPosition);
return new PointF(0, yDelta);
}
// This is the important method. This code will return the amount of time it takes to scroll 1 pixel.
// This code will request X milliseconds for every Y DP units.
@Override
protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics)
{
return X / TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, Y, displayMetrics);
}
};
smoothScroller.setTargetPosition(position);
startSmoothScroll(smoothScroller);
}
在此示例中,我使用了一个名为"calculateCurrentDistanceToPosition"的辅助方法.这可能有点棘手,因为它涉及跟踪当前滚动位置并计算给定y位置的滚动位置.您可以在此处处找到如何跟踪回收者滚动的示例一个>.
In this example, I use a helper method named "calculateCurrentDistanceToPosition". This can be a bit tricky, since it involves keeping track of your current scroll position, and calculating the scroll position of a given y position. You can find an example of how to keep track of the recycler's scroll y here.
计算给定位置的滚动y实际取决于回收商显示的内容.假设所有物品的高度相同,则可以通过以下计算来计算高度:
Calculating the scroll y of a given position is really dependent on what your recycler is displaying. Assuming all your items are the same height, you can calculate this by performing the following calculation:
targetScrollY = targetPosition * itemHeight
然后,要计算您需要滚动的距离,只需将当前滚动y与目标滚动y相减即可:
Then, to calculate the distance you need to scroll, simply subtract the current scroll y with the target scroll y:
private int calculateCurrentDistanceToPosition(int targetPosition) {
int targetScrollY = targetPosition * itemHeight;
return targetScrollY - currentScrollY;
}
2.降低手动滚动速度.
这一次,您需要再次编辑布局管理器-scrollVerticallyBy
方法:
Once again, you need to edit your layout manager, this time - the scrollVerticallyBy
method:
@Override
public int scrollVerticallyBy(int delta, Recycler recycler, State state)
{
// write your limiting logic here to prevent the delta from exceeding the limits of your list.
int prevDelta = delta;
if (getScrollState() == SCROLL_STATE_DRAGGING)
delta = (int)(delta > 0 ? Math.max(delta * MANUAL_SCROLL_SLOW_RATIO, 1) : Math.min(delta * MANUAL_SCROLL_SLOW_RATIO, -1));
// MANUAL_SCROLL_SLOW_RATIO is between 0 (no manual scrolling) to 1 (normal speed) or more (faster speed).
// write your scrolling logic code here whereby you move each view by the given delta
if (getScrollState() == SCROLL_STATE_DRAGGING)
delta = prevDelta;
return delta;
}
编辑:在上述方法中,我称为"getScrollState()
".这是RecyclerView
的方法.在此实现中,我的自定义LayoutManager
是我的自定义RecyclerView
的嵌套类.如果这对您不起作用,您可以尝试通过某种界面模式来获取滚动状态.
In the above method, I call "getScrollState()
". This is a method of RecyclerView
. In this implementation, my custom LayoutManager
is a nested class of my custom RecyclerView
. If this doesn't work for you, you can try to grab the scroll state via some interface pattern.
3.放慢逃跑速度
您要在此处减小下垂速度.您将需要在RecyclerView子类中覆盖fling
方法:
Here you want to scale down the fling velocity. You will need to override the fling
method inside your RecyclerView subclass:
@Override
public boolean fling(int velocityX, int velocityY)
{
velocityY *= FLING_SCALE_DOWN_FACTOR; // (between 0 for no fling, and 1 for normal fling, or more for faster fling).
return super.fling(velocityX, velocityY);
}
由于您没有发布任何代码,也没有提供许多有关设置的信息,因此我很难提供更具针对性的解决方案,但我希望这涵盖了大多数基础知识,并将帮助您找到最佳的解决方案
It's difficult for me to provide a more tailored solution, since you didn't post any of your code, or provide much information about your setup, but I hope this covers most bases and will help you find the best solution for you.
这篇关于Android:控制平滑滚动浏览回收站视图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!