Skip to content

Instantly share code, notes, and snippets.

@gabriel-TheCode
Created June 25, 2021 10:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gabriel-TheCode/4bf185b5aedec91cc09d62ba2589688c to your computer and use it in GitHub Desktop.
Save gabriel-TheCode/4bf185b5aedec91cc09d62ba2589688c to your computer and use it in GitHub Desktop.
Custom FabBottomNavigationView
import android.annotation.SuppressLint
import android.content.Context
import android.graphics.Paint
import android.util.AttributeSet
import androidx.core.content.ContextCompat
import com.google.android.material.bottomappbar.BottomAppBarTopEdgeTreatment
import com.google.android.material.bottomnavigation.BottomNavigationView
import com.google.android.material.floatingactionbutton.FloatingActionButton
import com.google.android.material.shape.CornerFamily
import com.google.android.material.shape.MaterialShapeDrawable
import com.google.android.material.shape.ShapeAppearanceModel
@SuppressLint("RestrictedApi")
class FabBottomNavigationView @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : BottomNavigationView(context, attrs, defStyleAttr) {
private var topCurvedEdgeTreatment: BottomAppBarTopEdgeTreatment
private var materialShapeDrawable: MaterialShapeDrawable
private var fabSize = 0F
var fabCradleMargin = 0F
var fabCradleRoundedCornerRadius = 0F
var topCornerRadius = 0F
var cradleVerticalOffset = 0F
init {
val ta =
context.theme.obtainStyledAttributes(attrs, R.styleable.FabBottomNavigationView, 0, 0)
fabSize = ta.getDimension(R.styleable.FabBottomNavigationView_fab_size, 0F)
fabCradleMargin = ta.getDimension(R.styleable.FabBottomNavigationView_fab_cradle_margin, 0F)
fabCradleRoundedCornerRadius =
ta.getDimension(
R.styleable.FabBottomNavigationView_fab_cradle_rounded_corner_radius,
0F
)
topCornerRadius = ta.getDimension(R.styleable.FabBottomNavigationView_top_corner_radius, 0F)
cradleVerticalOffset =
ta.getDimension(R.styleable.FabBottomNavigationView_cradle_vertical_offset, 0F)
topCurvedEdgeTreatment = BottomAppBarTopEdgeTreatment(
fabCradleMargin,
fabCradleRoundedCornerRadius,
cradleVerticalOffset
).apply {
fabDiameter = fabSize
}
val shapeAppearanceModel = ShapeAppearanceModel.Builder()
.setTopEdge(topCurvedEdgeTreatment)
.setTopLeftCorner(CornerFamily.ROUNDED, topCornerRadius)
.setTopRightCorner(CornerFamily.ROUNDED, topCornerRadius)
.build()
materialShapeDrawable = MaterialShapeDrawable(shapeAppearanceModel).apply {
setTint(ContextCompat.getColor(context, R.color.navigation_tint))
paintStyle = Paint.Style.FILL_AND_STROKE
}
background = materialShapeDrawable
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment