RecyclerView首个item收缩隐藏
2018-09-29 本文已影响39人
有点健忘
参考这里
看到这个效果不错,本来想学习下,不过感觉代码太多,就想自己实现,效果如下
第一item消失的时候,有收缩,透明度变小的动画,出现的时候当然是放大了。
看到第一眼,其实应该能看出,除了第一个item,其他的就是线性LiearLayoutManager的效果,那为啥不在这个基础上修改了。
所以就继承LiearLayoutManager,处理下滚动事件,在滚动的时候动态修改第一个item的大小位置即可
完整代码如下,很简单,没多少
import android.content.Context
import android.support.v7.widget.LinearLayoutManager
import android.support.v7.widget.RecyclerView
import android.view.View
class LayoutManagerScaleFirst:LinearLayoutManager{
constructor(context: Context?) : super(context)
constructor(context: Context?, orientation: Int, reverseLayout: Boolean) : super(context, orientation, reverseLayout)
var oldChild0:View?=null;
val scaleMinFactor=0.7f //from 0 to 1
override fun scrollVerticallyBy(dy: Int, recycler: RecyclerView.Recycler, state: RecyclerView.State?): Int {
val result=super.scrollVerticallyBy(dy, recycler, state)
if(childCount>1){
val child1=getChildAt(1)
val child0=getChildAt(0)
if(oldChild0!=null&&oldChild0!=child0){
resetChild(oldChild0!!)
}
oldChild0=child0
val scale=scaleMinFactor+(1-scaleMinFactor)*(child1.top)/getDecoratedMeasuredHeight(child1)
viewAnimate(child0,scale,getDecoratedMeasuredHeight(child1)-child1.top.toFloat())
if(scale<scaleMinFactor){
resetChild(child0)
removeAndRecycleView(child0,recycler)
}
}
return result
}
private fun resetChild(child:View){
viewAnimate(child,1f,0f)
}
private fun viewAnimate(child: View,factor:Float,transY:Float){
child.apply {
pivotX=this.width/2f
pivotY=this.height/1f
scaleX=factor;
scaleY=factor;
alpha=factor;
translationY=transY
}
}
}