首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何制作带有自定义形状制造按钮的Bottombar?

如何制作带有自定义形状制造按钮的Bottombar?
EN

Stack Overflow用户
提问于 2020-07-14 13:05:21
回答 2查看 525关注 0票数 3

我想做一个底部的附加工厂按钮,如下图所示。如果任何人知道不同形状的按钮库的类型与底部与工厂,然后建议我。

下面给出的图像是这样制作一个底部栏的。

EN

回答 2

Stack Overflow用户

发布于 2020-07-14 14:11:33

这只是一个想法,代码可以改进。

可以使用shapeAppearanceOverlay属性更改FloatingActionButton的形状:

代码语言:javascript
运行
复制
<com.google.android.material.floatingactionbutton.FloatingActionButton
    app:shapeAppearanceOverlay="@style/cutfab"
    ..>

通过以下方式:

代码语言:javascript
运行
复制
<style name="cutfab">
    <item name="cornerFamily">cut</item>
    <item name="cornerSize">15dp</item>
</style>

然后,您可以在布局中定义BottomAppBar

代码语言:javascript
运行
复制
<com.google.android.material.bottomappbar.BottomAppBar
    android:id="@+id/bottomAppBar"
    app:fabAlignmentMode="center"
    app:fabCradleVerticalOffset="14dp"
    app:fabCradleMargin="8dp" />

最后,您可以向BottomAppBar申请TopEdgeTreatment.类似于:

代码语言:javascript
运行
复制
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类似于:

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

票数 4
EN

Stack Overflow用户

发布于 2020-07-14 14:21:12

为了在你的应用中使用最新风格的BottomAppBar。

1)在build.gradle中包含Google Maven存储库。

代码语言:javascript
运行
复制
allprojects {
repositories {
  jcenter()
  maven {
    url "https://maven.google.com"
   }
  }
}

2)将材料组件从属关系放置在build.gradle中。请记住,材料版本会定期更新。

代码语言:javascript
运行
复制
implementation 'com.google.android.material:material:1.0.0-alpha1'

3)确保你的应用程序继承了Theme.MaterialComponents主题,以便让BottomAppBar使用最新的样式。或者,您可以在布局xml文件内的小部件声明中声明BottomAppBar的样式,如下所示。

代码语言:javascript
运行
复制
style=”@style/Widget.MaterialComponents.BottomAppBar”

您可以在布局中包含BottomAppBar,如下所示。BottomAppBar必须是CoordinatorLayout的子级。

代码语言:javascript
运行
复制
<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重叠。

代码语言:javascript
运行
复制
<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" />

感谢

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

https://stackoverflow.com/questions/62888408

复制
相关文章

相似问题

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