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()
}
}