我想做一个底部的附加工厂按钮,如下图所示。如果任何人知道不同形状的按钮库的类型与底部与工厂,然后建议我。
下面给出的图像是这样制作一个底部栏的。
发布于 2020-07-14 14:11:33
这只是一个想法,代码可以改进。
可以使用shapeAppearanceOverlay
属性更改FloatingActionButton
的形状:
<com.google.android.material.floatingactionbutton.FloatingActionButton
app:shapeAppearanceOverlay="@style/cutfab"
..>
通过以下方式:
<style name="cutfab">
<item name="cornerFamily">cut</item>
<item name="cornerSize">15dp</item>
</style>
然后,您可以在布局中定义BottomAppBar
:
<com.google.android.material.bottomappbar.BottomAppBar
android:id="@+id/bottomAppBar"
app:fabAlignmentMode="center"
app:fabCradleVerticalOffset="14dp"
app:fabCradleMargin="8dp" />
最后,您可以向BottomAppBar
申请TopEdgeTreatment
.类似于:
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());
其中BottomAppBarCutCornersTopEdge
类似于:
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);
}
}
为了获得更好的结果,您应该扩展CutCornerTreatment
,在getCornerPath
方法中实现与BottomAppBar
中使用的路径相同的路径,并将其应用于FloatingActionButton
。
发布于 2020-07-14 14:21:12
为了在你的应用中使用最新风格的BottomAppBar。
1)在build.gradle中包含Google Maven存储库。
allprojects {
repositories {
jcenter()
maven {
url "https://maven.google.com"
}
}
}
2)将材料组件从属关系放置在build.gradle
中。请记住,材料版本会定期更新。
implementation 'com.google.android.material:material:1.0.0-alpha1'
3)确保你的应用程序继承了Theme.MaterialComponents
主题,以便让BottomAppBar使用最新的样式。或者,您可以在布局xml文件内的小部件声明中声明BottomAppBar的样式,如下所示。
style=”@style/Widget.MaterialComponents.BottomAppBar”
您可以在布局中包含BottomAppBar,如下所示。BottomAppBar必须是CoordinatorLayout的子级。
<com.google.android.material.bottomappbar.BottomAppBar
android:id="@+id/bottom_app_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
app:backgroundTint="@color/colorPrimary"
app:fabAlignmentMode="center"
app:fabAttached="true"
app:navigationIcon="@drawable/baseline_menu_white_24"/>
通过在FAB的app:layout_anchor
属性中指定BottomAppBar的id,可以将浮动操作按钮(FAB)锚定到BottomAppBar。BottomAppBar可以在FAB上放置一个有形状的背景,或者FAB可以与BottomAppBar重叠。
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/baseline_add_white_24"
app:layout_anchor="@id/bottom_app_bar" />
感谢
https://stackoverflow.com/questions/62888408
复制相似问题