这个效果有点一言难尽,上个图吧。
就是这个效果:当某个item移动到屏幕中间的时候停止滑动这个item会自动滑动向中间。
有点像画廊那个效果,但是画廊的图片比较大。
那么该如何实现的呢?
刚开始我是自己计算的:
override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
super.onScrollStateChanged(recyclerView, newState)
if(newState==0&&isScroll){
isScroll=false
val right=recyclerView.right
val left=recyclerView.left
val recyclerViewCenter=(left+right)/2
var lastViewItemOffset=99999
var lastView:View?=null
for (item in adapter.itemViews) {
val cRight=item.right
val cLeft=item.left
val cCenter=(cLeft+cRight)/2+cLeft
val itemOffset= abs(recyclerViewCenter-cCenter)
if(lastViewItemOffset>itemOffset){
lastViewItemOffset=itemOffset
lastView=item
}
}
if(lastView!=null){
val cRight=lastView.right
val cLeft=lastView.left
val cCenter=(cRight-cLeft)/2+cLeft
val centerOffset=recyclerViewCenter-cCenter
Log.d("centerOffset"," ${lastView.left} ${lastView.right} $centerOffset $recyclerViewCenter")
recyclerView.smoothScrollBy(centerOffset,0)
}
}
Log.d("onScrollStateChanged","$newState ${adapter.itemViews[1].left} ${adapter.itemViews[1].right}")
}
后来发现直接就有个方法可以用:
recyclerView.layoutManager =
LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false)
LinearSnapHelper().attachToRecyclerView(recyclerView)
直接使用LinearSnapHelper就可以达到这个效果...
使用androidx的朋友,直接就可以使用了。