如何使用fab风格的钻石?
How to use the fab style diamond?
fab + bottom app bar如何使用菱形样式?在网站 https://material.io/tools/theme-editor/ 上的草图文件中,有这样的样式 fab:
查看了所有可能的样式和标签...
目前BottomAppBar
没有正式的形状。
但是 material components library you can customize the shape of the FloatingActionButton
的版本 1.1.0 使用 app:shapeAppearance
属性。
您可以使用类似的东西:
<com.google.android.material.floatingactionbutton.FloatingActionButton
app:layout_anchor="@id/bar"
app:shapeAppearance="@style/FabDiamondOverlay"
.../>
采用这种风格:
<style name="FabDiamondOverlay" parent="">
<item name="cornerFamily">cut</item>
<item name="cornerSize">8dp</item>
</style>
结果是:
目前形状主题属性不影响 BottomAppBar
,您只能为 FAB 支架设置圆角。官方仓库中添加了workaround
只需使用具有属性 app:fabCradleMargin
的默认 BottomAppBar(它定义 FloatingActionButton
和 BottomAppBar
之间的距离)
<com.google.android.material.bottomappbar.BottomAppBar
android:id="@+id/bar"
...
android:layout_gravity="bottom"
app:fabCradleMargin="10dp"
/>
并使用BottomAppBarTopEdgeTreatment
改变BottomAppBar
的形状:
BottomAppBar bar = findViewById(R.id.bar);
FloatingActionButton fab2 = findViewById(R.id.fab);
BottomAppBarTopEdgeTreatment topEdge = new BottomAppBarCutCornersTopEdge(
bar.getFabCradleMargin(),
bar.getFabCradleRoundedCornerRadius(),
bar.getCradleVerticalOffset());
MaterialShapeDrawable babBackground = (MaterialShapeDrawable) bar.getBackground();
//It requires 1.1.0-alpha10
babBackground.setShapeAppearanceModel(
babBackground.getShapeAppearanceModel()
.toBuilder()
.setTopEdge(topEdge)
.build());
最后的结果是:
Gabriele Mariotti 的支持。我使用了他的代码并对其进行了一些更改,以便像原始问题中一样使底部应用程序栏具有圆形外观。
首先,对于 FAB,我将其圆化 corners 并将其旋转 45 度,如下所示:
XML 工厂代码:
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/fabHome"
android:rotation="45"
app:layout_anchor="@id/bottomBarHome"
app:shapeAppearanceOverlay="@style/FabDiamondOverlay"/>
FabDiamondOverlay 是:
<style name="FabDiamondOverlay" parent="">
<item name="cornerFamily">rounded</item>
<item name="cornerSize">15%</item>
</style>
这给出了结果 FAB:
现在底部栏 XML:
<com.google.android.material.bottomappbar.BottomAppBar
android:id="@+id/bottomBarHome"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:backgroundTint="@color/grey"
app:fabCradleMargin="20dp"
app:fabCradleVerticalOffset="5dp"
android:layout_gravity="bottom" />
OnCreate 方法中的这段代码为底部应用栏提供自定义外观:
BottomAppBar bar = findViewById(R.id.bottomBarHome);
BottomAppBarTopEdgeTreatment topEdge = new BottomAppBarCutCornersTopEdge(
bar.getFabCradleMargin(),
bar.getFabCradleRoundedCornerRadius(),
bar.getCradleVerticalOffset());
MaterialShapeDrawable bottomBarBackground = (MaterialShapeDrawable) bar.getBackground();
bottomBarBackground.setShapeAppearanceModel(
bottomBarBackground.getShapeAppearanceModel()
.toBuilder()
.setTopRightCorner(CornerFamily.ROUNDED,75)
.setTopLeftCorner(CornerFamily.ROUNDED,75)
.setTopEdge(topEdge)
.build());
其中BottomAppBarCutCornersTopEdge
是通过修改Gabrielle的代码:
Source
@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;
}
float barLeftVertex = middle - (fabMargin + diamondSize - cradleVerticalOffset);
float barRightVertex = middle + (fabMargin + diamondSize - cradleVerticalOffset);
float depth = (diamondSize - cradleVerticalOffset + fabMargin) * interpolation;
float heightArc = 25;
float widthArc = 25;
shapePath.lineTo(barLeftVertex, 0);
shapePath.lineTo(middle-widthArc, depth-heightArc);
shapePath.addArc(middle-widthArc-10, 35, middle+widthArc+10, depth-15, 135, -83);
shapePath.lineTo(middle+widthArc, depth-heightArc);
shapePath.lineTo(barRightVertex, 0);
shapePath.lineTo(length, 0);
}
这里的数值是通过命中和试炼决定的。我无法理解每个变量的作用,而且关于它的文档似乎真的很少。但它完成了工作!这是最终结果:
fab + bottom app bar如何使用菱形样式?在网站 https://material.io/tools/theme-editor/ 上的草图文件中,有这样的样式 fab:
查看了所有可能的样式和标签...
目前BottomAppBar
没有正式的形状。
但是 material components library you can customize the shape of the FloatingActionButton
的版本 1.1.0 使用 app:shapeAppearance
属性。
您可以使用类似的东西:
<com.google.android.material.floatingactionbutton.FloatingActionButton
app:layout_anchor="@id/bar"
app:shapeAppearance="@style/FabDiamondOverlay"
.../>
采用这种风格:
<style name="FabDiamondOverlay" parent="">
<item name="cornerFamily">cut</item>
<item name="cornerSize">8dp</item>
</style>
结果是:
目前形状主题属性不影响 BottomAppBar
,您只能为 FAB 支架设置圆角。官方仓库中添加了workaround
只需使用具有属性 app:fabCradleMargin
的默认 BottomAppBar(它定义 FloatingActionButton
和 BottomAppBar
之间的距离)
<com.google.android.material.bottomappbar.BottomAppBar
android:id="@+id/bar"
...
android:layout_gravity="bottom"
app:fabCradleMargin="10dp"
/>
并使用BottomAppBarTopEdgeTreatment
改变BottomAppBar
的形状:
BottomAppBar bar = findViewById(R.id.bar);
FloatingActionButton fab2 = findViewById(R.id.fab);
BottomAppBarTopEdgeTreatment topEdge = new BottomAppBarCutCornersTopEdge(
bar.getFabCradleMargin(),
bar.getFabCradleRoundedCornerRadius(),
bar.getCradleVerticalOffset());
MaterialShapeDrawable babBackground = (MaterialShapeDrawable) bar.getBackground();
//It requires 1.1.0-alpha10
babBackground.setShapeAppearanceModel(
babBackground.getShapeAppearanceModel()
.toBuilder()
.setTopEdge(topEdge)
.build());
最后的结果是:
Gabriele Mariotti 的支持。我使用了他的代码并对其进行了一些更改,以便像原始问题中一样使底部应用程序栏具有圆形外观。
首先,对于 FAB,我将其圆化 corners 并将其旋转 45 度,如下所示:
XML 工厂代码:
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/fabHome"
android:rotation="45"
app:layout_anchor="@id/bottomBarHome"
app:shapeAppearanceOverlay="@style/FabDiamondOverlay"/>
FabDiamondOverlay 是:
<style name="FabDiamondOverlay" parent="">
<item name="cornerFamily">rounded</item>
<item name="cornerSize">15%</item>
</style>
这给出了结果 FAB:
现在底部栏 XML:
<com.google.android.material.bottomappbar.BottomAppBar
android:id="@+id/bottomBarHome"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:backgroundTint="@color/grey"
app:fabCradleMargin="20dp"
app:fabCradleVerticalOffset="5dp"
android:layout_gravity="bottom" />
OnCreate 方法中的这段代码为底部应用栏提供自定义外观:
BottomAppBar bar = findViewById(R.id.bottomBarHome);
BottomAppBarTopEdgeTreatment topEdge = new BottomAppBarCutCornersTopEdge(
bar.getFabCradleMargin(),
bar.getFabCradleRoundedCornerRadius(),
bar.getCradleVerticalOffset());
MaterialShapeDrawable bottomBarBackground = (MaterialShapeDrawable) bar.getBackground();
bottomBarBackground.setShapeAppearanceModel(
bottomBarBackground.getShapeAppearanceModel()
.toBuilder()
.setTopRightCorner(CornerFamily.ROUNDED,75)
.setTopLeftCorner(CornerFamily.ROUNDED,75)
.setTopEdge(topEdge)
.build());
其中BottomAppBarCutCornersTopEdge
是通过修改Gabrielle的代码:
Source
@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;
}
float barLeftVertex = middle - (fabMargin + diamondSize - cradleVerticalOffset);
float barRightVertex = middle + (fabMargin + diamondSize - cradleVerticalOffset);
float depth = (diamondSize - cradleVerticalOffset + fabMargin) * interpolation;
float heightArc = 25;
float widthArc = 25;
shapePath.lineTo(barLeftVertex, 0);
shapePath.lineTo(middle-widthArc, depth-heightArc);
shapePath.addArc(middle-widthArc-10, 35, middle+widthArc+10, depth-15, 135, -83);
shapePath.lineTo(middle+widthArc, depth-heightArc);
shapePath.lineTo(barRightVertex, 0);
shapePath.lineTo(length, 0);
}
这里的数值是通过命中和试炼决定的。我无法理解每个变量的作用,而且关于它的文档似乎真的很少。但它完成了工作!这是最终结果: