Android开发

RecyclerView首个item收缩隐藏

2018-09-29  本文已影响39人  有点健忘

参考这里
看到这个效果不错,本来想学习下,不过感觉代码太多,就想自己实现,效果如下

image.png

第一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
        }
    }
}
上一篇下一篇

猜你喜欢

热点阅读