I want to make a bottombar with attach fab button like given below image. If anyone knows about that type of different shape button library with a bottom with fab then suggest to me.
The image is given below make a bottombar with fab like this.

It is just an idea the code can be improved.
You can change the shape of the FloatingActionButton with the shapeAppearanceOverlay attribute:
<com.google.android.material.floatingactionbutton.FloatingActionButton
app:shapeAppearanceOverlay="@style/cutfab"
..>
with:
<style name="cutfab">
<item name="cornerFamily">cut</item>
<item name="cornerSize">15dp</item>
</style>
Then you can define the BottomAppBar in your layout:
<com.google.android.material.bottomappbar.BottomAppBar
android:id="@+id/bottomAppBar"
app:fabAlignmentMode="center"
app:fabCradleVerticalOffset="14dp"
app:fabCradleMargin="8dp" />
Finally you can apply to the BottomAppBar a TopEdgeTreatment. Something like:
BottomAppBar bar = findViewById(R.id.bar);
BottomAppBarTopEdgeTreatment topEdge = new BottomAppBarCutCornersTopEdge(
bar.getFabCradleMargin(),
bar.getFabCradleRoundedCornerRadius(),
bar.getCradleVerticalOffset());
MaterialShapeDrawable babBackground = (MaterialShapeDrawable) bar.getBackground();
babBackground.setShapeAppearanceModel(
babBackground.getShapeAppearanceModel()
.toBuilder()
.setTopEdge(topEdge)
.build());

Where the BottomAppBarCutCornersTopEdge is something like:
public class BottomAppBarCutCornersTopEdge extends BottomAppBarTopEdgeTreatment {
private final float fabMargin;
private final float cradleVerticalOffset;
BottomAppBarCutCornersTopEdge(
float fabMargin, float roundedCornerRadius, float cradleVerticalOffset) {
super(fabMargin, roundedCornerRadius, cradleVerticalOffset);
this.fabMargin = fabMargin;
this.cradleVerticalOffset = cradleVerticalOffset;
}
@Override
@SuppressWarnings("RestrictTo")
public void getEdgePath(float length, float center, float interpolation, ShapePath shapePath) {
float fabDiameter = getFabDiameter();
if (fabDiameter == 0) {
shapePath.lineTo(length, 0);
return;
}
float diamondSize = fabDiameter / 2f;
float middle = center + getHorizontalOffset();
float verticalOffsetRatio = cradleVerticalOffset / diamondSize;
if (verticalOffsetRatio >= 1.0f) {
shapePath.lineTo(length, 0);
return;
}
shapePath.lineTo(middle - (fabMargin + diamondSize), 0);
shapePath.lineTo(middle - fabDiameter/3, (diamondSize - cradleVerticalOffset + fabMargin) * interpolation);
shapePath.lineTo(middle + fabDiameter/3, (diamondSize - cradleVerticalOffset + fabMargin) * interpolation);
shapePath.lineTo(middle + (fabMargin + diamondSize), 0);
shapePath.lineTo(length, 0);
}
}
To obtain a better result you should extend the CutCornerTreatment, implementing in the getCornerPath method the same path used in the BottomAppBar and apply it to the FloatingActionButton.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With