首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用fab风格的钻石?

问如何使用fab风格的钻石?
EN

Stack Overflow用户
提问于 2019-01-06 21:46:45
回答 2查看 1.8K关注 0票数 8

如何使用菱形风格的fab +底部应用程序栏?在https://material.io/tools/theme-editor/网站的草图文件中,有这样的样式:

​

看了所有可能的样式和标签..。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-18 16:13:19

给加布里埃尔·马里奥蒂的道具。我使用了他的代码,并对它做了一些修改,让它看起来像原来的问题一样的底部应用程序栏。

首先,我给了它圆的弯角,然后把它旋转了45度,如下所示:

fab的XML代码:

代码语言:javascript
复制
<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是:

代码语言:javascript
复制
<style name="FabDiamondOverlay" parent="">
    <item name="cornerFamily">rounded</item>
    <item name="cornerSize">15%</item>
</style>

由此产生的FAB:

​

​

下面是XML:

代码语言:javascript
复制
<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方法中的这段代码为底部的app条提供了一个自定义外观:

代码语言:javascript
复制
    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:来源

代码语言:javascript
复制
@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);
    }

这里的数值是由命中和试验决定的。我不明白每个变量都做了些什么,而且关于它的文档似乎少了很多。但它能完成任务!最后的结果如下:

​

​

票数 1
EN

Stack Overflow用户

发布于 2019-08-26 20:35:11

目前,BottomAppBar还没有一个正式的形状。

但是,使用app:shapeAppearance的版本1.1.0,您可以使用材料元件库属性自定义FloatingActionButton的形状。

您可以使用以下内容:

代码语言:javascript
复制
 <com.google.android.material.floatingactionbutton.FloatingActionButton
        app:layout_anchor="@id/bar"
        app:shapeAppearance="@style/FabDiamondOverlay"
        .../>

用这种风格:

代码语言:javascript
复制
 <style name="FabDiamondOverlay" parent="">
    <item name="cornerFamily">cut</item>
    <item name="cornerSize">8dp</item>
  </style>

其结果是:

​

​

目前,形状主题属性不影响BottomAppBar,而且您只能为FAB摇篮设置圆角。在官方存储库中添加了一个解决办法。

只需在属性app:fabCradleMargin中使用默认的BottomAppBar (它定义了FloatingActionButton和BottomAppBar之间的距离)

代码语言:javascript
复制
<com.google.android.material.bottomappbar.BottomAppBar
        android:id="@+id/bar"
        ...
        android:layout_gravity="bottom"
        app:fabCradleMargin="10dp"
        />

并使用BottomAppBarTopEdgeTreatment更改BottomAppBar的形状。

代码语言:javascript
复制
    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());

这是最后的结果:

​

​

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54066244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档