使用选择器更改时,浮动操作按钮图标未居中对齐

Floating action button icon is not aligned centre when changed using selector

当用户触摸图标时,我使用 android 选择器切换浮动操作按钮中的图标。通常,图标在浮动操作按钮中居中对齐,但在用户触摸图标后,切换的图像未正确对齐。请帮助我。

这是我的代码。

<com.google.android.material.floatingactionbutton.FloatingActionButton
    android:id="@+id/btn_drive_mode"
    style="@style/Widget.MaterialComponents.FloatingActionButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:fabSize="mini"
    android:layout_margin="@dimen/dp_16"
    android:contentDescription="map_center_icon"
    app:srcCompat="@drawable/toggle_drive_mode_selector"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintBottom_toTopOf="@id/footer"
    app:backgroundTint="@color/green"
    app:tint="@color/white"/>

我的选择器文件

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/ic_location" android:state_activated="true" />
    <item android:drawable="@android:drawable/ic_dialog_map" />
</selector>

但是图像是这样的,

点击前

点击后

深入研究 FloatingActionButton 源代码后,您可以看到超类的比例类型设置为 ScaleType.MATRIX 并且在调用 [=12= 期间设置了图像矩阵] 如您所料。

但是他们似乎没有在 drawableStateChanged 期间更新矩阵,我认为这是一个微妙的错误,而不是预期的行为。

因此,要解决此问题,您可以执行以下两项操作之一:


强制 FloatingActionButton 使用不同的刻度类型

他们以编程方式在初始化的最后一行设置比例类型,因此它要么必须用子类重置,要么在布局后发布,要么在每次翻转激活状态时设置。

使用相同大小的图标

您遇到此错误而其他人可能没有遇到此错误的原因是您使用来自不同来源的图标来进行切换。如果你 从 Material Icons 集中获取两个图标,然后由于图标需要相同的矩阵,缩放不会导致问题。


就我个人而言,我会推荐第二种方法,无论如何,使用您自己的图标而不是平台图标很可能是最佳做法,并且在不理解其存在原因的情况下更改 FloatingActionButton 的行为可能会导致意想不到的后果。