make first child of the BreadCrumbs sticky

This commit is contained in:
Paul Akhamiogu 2021-08-26 04:14:43 +01:00
parent 5d01963b73
commit 2fd45be05e

View file

@ -2,13 +2,14 @@ package com.simplemobiletools.commons.views
import android.content.Context import android.content.Context
import android.content.res.ColorStateList import android.content.res.ColorStateList
import android.graphics.drawable.GradientDrawable
import android.util.AttributeSet import android.util.AttributeSet
import android.util.TypedValue import android.util.TypedValue
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.widget.HorizontalScrollView import android.widget.HorizontalScrollView
import android.widget.LinearLayout import android.widget.LinearLayout
import androidx.core.content.ContextCompat import androidx.core.view.ViewCompat
import com.simplemobiletools.commons.R import com.simplemobiletools.commons.R
import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.models.FileDirItem import com.simplemobiletools.commons.models.FileDirItem
@ -23,6 +24,7 @@ class Breadcrumbs(context: Context, attrs: AttributeSet) : HorizontalScrollView(
private var isLayoutDirty = true private var isLayoutDirty = true
private var isScrollToSelectedItemPending = false private var isScrollToSelectedItemPending = false
private var isFirstScroll = true private var isFirstScroll = true
private var stickyRootInitialLeft = 0
private val textColorStateList: ColorStateList private val textColorStateList: ColorStateList
get() = ColorStateList( get() = ColorStateList(
@ -44,6 +46,45 @@ class Breadcrumbs(context: Context, attrs: AttributeSet) : HorizontalScrollView(
itemsLayout.setPaddingRelative(paddingStart, paddingTop, paddingEnd, paddingBottom) itemsLayout.setPaddingRelative(paddingStart, paddingTop, paddingEnd, paddingBottom)
setPaddingRelative(0, 0, 0, 0) setPaddingRelative(0, 0, 0, 0)
addView(itemsLayout, LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT)) addView(itemsLayout, LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT))
onGlobalLayout {
stickyRootInitialLeft = if (itemsLayout.childCount > 0) {
itemsLayout.getChildAt(0).left
} else {
0
}
}
}
private fun recomputeStickyRootLocation(left: Int) {
stickyRootInitialLeft = left
handleRootStickiness(scrollX)
}
private fun handleRootStickiness(scrollX: Int) {
if (scrollX > stickyRootInitialLeft) {
stickRoot(scrollX - stickyRootInitialLeft)
} else {
freeRoot()
}
}
private fun freeRoot() {
if (itemsLayout.childCount > 0) {
itemsLayout.getChildAt(0).translationX = 0f
}
}
private fun stickRoot(translationX: Int) {
if (itemsLayout.childCount > 0) {
val root = itemsLayout.getChildAt(0)
root.translationX = translationX.toFloat()
ViewCompat.setTranslationZ(root, translationZ)
}
}
override fun onScrollChanged(scrollX: Int, scrollY: Int, oldScrollX: Int, oldScrollY: Int) {
super.onScrollChanged(scrollX, scrollY, oldScrollX, oldScrollY)
handleRootStickiness(scrollX)
} }
override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) { override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
@ -54,6 +95,8 @@ class Breadcrumbs(context: Context, attrs: AttributeSet) : HorizontalScrollView(
scrollToSelectedItem() scrollToSelectedItem()
isScrollToSelectedItemPending = false isScrollToSelectedItemPending = false
} }
recomputeStickyRootLocation(left)
} }
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
@ -139,8 +182,14 @@ class Breadcrumbs(context: Context, attrs: AttributeSet) : HorizontalScrollView(
if (itemsLayout.childCount == 0) { if (itemsLayout.childCount == 0) {
resources.apply { resources.apply {
background = ContextCompat.getDrawable(context, R.drawable.button_background) val shapeDrawable = GradientDrawable()
background.applyColorFilter(textColor) shapeDrawable.shape = GradientDrawable.RECTANGLE
shapeDrawable.cornerRadius = getDimension(R.dimen.medium_margin)
shapeDrawable.mutate()
shapeDrawable.setColor(context.baseConfig.backgroundColor)
shapeDrawable.setStroke(getDimensionPixelOffset(R.dimen.tiny_margin), textColorStateList)
background = shapeDrawable
elevation = getDimension(R.dimen.medium_margin)
val medium = getDimension(R.dimen.medium_margin).toInt() val medium = getDimension(R.dimen.medium_margin).toInt()
setPadding(medium, medium, medium, medium) setPadding(medium, medium, medium, medium)
} }