How to scale and fade out itemdecoration view in recyclerview when scroll up and down

14 Views Asked by At

I have a recyclerview with itemdecoration views as sticky views , now i want to animate them when i scroll the recyleview like this . https://davidl536.sg-host.com/sch/schedule/all/

I can fade my items but not able to scale them .

Please help me to how to combine all this animations to canvas inside

onDrawOver 

method.My code is like this

override fun onDrawOver(c: Canvas, parent: RecyclerView, state: RecyclerView.State) {
    super.onDrawOver(c, parent, state)

    val lastIndex = parent.adapter?.let { it.itemCount - 1 } ?: return

    for (childPosition in (0..parent.childCount)) {
        val view = parent.getChildAt(childPosition)

        val position = parent.getChildAdapterPosition(view)

        if (position == RecyclerView.NO_POSITION) {
            continue
        }


        val header = headerProvider.getHeader(position)
        val headerView = getHeaderView(header, parent)
        val wrapContentMeasureSpec =
            View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)
        headerView.measure(wrapContentMeasureSpec, wrapContentMeasureSpec)
        headerView.layout(0, 0, headerView.measuredWidth, headerView.measuredHeight)

        val beginsGroup = (position == 0 || header != headerProvider.getHeader(position - 1))
        val endsGroup =
            (position == lastIndex || header != headerProvider.getHeader(position + 1))

        c.save()
        val layoutManager = parent.layoutManager as LinearLayoutManager

        parent.addOnScrollListener(object : RecyclerView.OnScrollListener() {

            override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
                super.onScrollStateChanged(recyclerView, newState)
            }

            override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
                super.onScrolled(recyclerView, dx, dy)
                if (dy > 0) {
                   isScrollingUp = true
                    isScrollingDown = false
                } else if (dy < 0) {
                    isScrollingDown = true
                    isScrollingUp = false
                } else {
                    isScrollingDown = false
                    isScrollingUp = false
                }
            }
        })

        if (childPosition == 0) {
            val top = when {
                beginsGroup && endsGroup -> view.top.toFloat()
                endsGroup -> min(view.bottom - headerView.measuredHeight, 0).toFloat()
                else -> 0f
            }
            Log.e("venu","childPosition")

            if(isScrollingUp) {
                Log.e("venu","pos "+c.width + " "+c.height)
                val firstVisibleItemPos = layoutManager.findFirstVisibleItemPosition()
                val firstView = headerProvider.getHeader(firstVisibleItemPos)
                if (firstView != headerProvider.getHeader(firstVisibleItemPos + 1)) {
                    val scaleFactor = calculateScaleFactor(parent, headerView)
                    val pivotX = width / 2.0f
                    val pivotY = height / 2.0f
                   // c.translate(0f,top)
                     // c.scale(0f,1000f)
                    c.saveLayerAlpha(0f, 0f, headerView.width.toFloat(), headerView.height.toFloat(), 85)
                   // c.scale(0f,1000f)
                    c.translate(0f,top)
                   // c.scale(c.width/2.toFloat() ,c.height.toFloat())

                   // c.scale(pivotX,pivotY)
                   // ViewCompat.animate(headerView).scaleX(0.8f).scaleY(0.8f).setDuration(600).setInterpolator(AccelerateInterpolator())
                    headerView.draw(c)
                 /*   ViewCompat.animate(headerView).alpha(0.5f).translationY(top)
                        .setDuration(600).setInterpolator(AccelerateInterpolator())*/

                }else{
                    c.translate(0f, top)
                    // c.scale(.5f,top)
                    headerView.draw(c)
                }
            }else if(isScrollingDown) {
                val firstVisibleItemPos = layoutManager.findFirstVisibleItemPosition()
                val firstView = headerProvider.getHeader(firstVisibleItemPos)
                if (firstVisibleItemPos >0 && firstView != headerProvider.getHeader(firstVisibleItemPos + 1)) {
                    val scaleFactor = calculateScaleFactor(parent, view)
                    val pivotX = width / 2.0f
                    val pivotY = height / 2.0f
                   // c.saveLayerAlpha(headerView.width.toFloat(), headerView.height.toFloat(), 0f, 0f, 85)
                   // c.translate(0f,view.top.toFloat())
                    c.saveLayerAlpha(0f, 0f, headerView.width.toFloat(), headerView.height.toFloat(), 100)
                    headerView.draw(c)
                }else{
                    c.translate(0f, top)
                    // c.scale(.5f,top)
                    headerView.draw(c)
                }
            }
            else {
                c.translate(0f, top)
                // c.scale(.5f,top)
                headerView.draw(c)
            }
        } else if (beginsGroup) {
            Log.e("venu","beginsGroup")
            c.translate(0f, view.top.toFloat())
            headerView.draw(c)
        }
        c.restore()
    }
}
0

There are 0 best solutions below