将自定义标签添加到 material 范围滑块
Add a custom label to material range slider
我正在使用 Android material 组件库的最新 (1.3.0-alpha01) 版本来显示范围滑块(带有两个拇指的滑块)。现在需要自定义标签并且始终 在 TextView 中的缩略图上显示每个缩略图的值(没有任何可绘制对象或默认标志,请参见附图)。如何使 labelBehavior
始终可见并在用户拖动时在自定义视图中显示缩略图值?
要更改标签的背景颜色,您可以使用自定义样式:
<com.google.android.material.slider.RangeSlider
style="@style/Myslider"
...>
与:
<style name="Myslider" parent="@style/Widget.MaterialComponents.Slider">
<item name="labelStyle">@style/My_Tooltip</item>
<item name="materialThemeOverlay">@style/ThemeOverlay.Slider</item>
</style>
<style name="My_Tooltip" parent="Widget.MaterialComponents.Tooltip">
<!-- background color of the Tooltip -->
<item name="backgroundTint">@color/...</item>
</style>
<style name="ThemeOverlay.Slider" parent="">
<!-- color used by the text in the Tooltip -->
<item name="colorOnPrimary">@color/...</item>
</style>
要自定义标签中的值,您可以 LabelFormatter
.
类似于:
RangeSlider slider = findViewById(R.id.slider);
slider.setLabelFormatter(new LabelFormatter() {
@NonNull
@Override
public String getFormattedValue(float value) {
//It is just an example
if (value == 3.0f)
return "TEST";
return String.format(Locale.US, "%.0f", value);
}
});
关于标签的 行为 只有这些值(1.2.0-beta01
和 1.3.0-alpha01)
:
LABEL_FLOATING
:标签仅在交互时可见。它将漂浮在滑块上方,并可能覆盖此滑块上方的视图。这是默认和推荐的行为。
LABEL_WITHIN_BOUNDS
:标签仅在交互时可见。标签将始终绘制在此视图的边界内。这意味着当标签不可见时,额外的 space 将在滑块上方可见。
LABEL_GONE
: 永远不会绘制标签。
目前似乎无法始终显示标签。
您可以在布局或样式中使用 setLabelBehavior
方法或 labelBehavior
设置标签行为。
<com.google.android.material.slider.RangeSlider
app:labelBehavior="withinBounds"/>
如果你想改变标签的形状你可以检查这个。
这应该是一个评论,但我不能评论所以在这里。
正如 Gabriele 已经告诉您的那样,您不能将标签 (TooltipDrawable
) 永久地贴在拇指上方。事实上,您应该覆盖 BaseSlider
的一些方法,但它们依赖于私有字段。
我还想(对访客)说,我不能像 Gabriele 所说的那样更改标签的文本颜色。我有版本 1.3.0-alpha01
。
我不得不重新设置另一个组件的样式,TextAppearance.MaterialComponents.Tooltip
.
my_layout.xml
<com.google.android.material.slider.Slider
...
app:labelStyle="@style/MyTooltip"
...
/>
res/values/styles.xml:
<style name="MyTooltip" parent="Widget.MaterialComponents.Tooltip">
<item name="backgroundTint">...</item>
<item name="android:textAppearance">@style/MyTooltip.TextAppearance</item>
</style>
<style name="MyTooltip.TextAppearance" parent="@style/TextAppearance.MaterialComponents.Tooltip">
<item name="android:textColor">...</item>
<item name="android:fontFamily">...</item>
<item name="fontFamily">...</item>
<item name="android:textSize">...</item>
</style>
我想跟进 Gabrielle,特别是重新标记 Material 滑块。
当实施类似的东西时:
RangeSlider slider = findViewById(R.id.slider);
slider.setLabelFormatter(new LabelFormatter() {
@NonNull
@Override
public String getFormattedValue(float value) {
//It is just an example
if (value == 3.0f)
return "TEST";
return String.format(Locale.US, "%.0f", value);
}
});
一定要正确判断Slider的类型。如果您使用 material.Slider,则需要将 RangeSlider
更改为 Slider
,因为 Android 无法自动为您转换数据类型。
我正在使用 Android material 组件库的最新 (1.3.0-alpha01) 版本来显示范围滑块(带有两个拇指的滑块)。现在需要自定义标签并且始终 在 TextView 中的缩略图上显示每个缩略图的值(没有任何可绘制对象或默认标志,请参见附图)。如何使 labelBehavior
始终可见并在用户拖动时在自定义视图中显示缩略图值?
要更改标签的背景颜色,您可以使用自定义样式:
<com.google.android.material.slider.RangeSlider
style="@style/Myslider"
...>
与:
<style name="Myslider" parent="@style/Widget.MaterialComponents.Slider">
<item name="labelStyle">@style/My_Tooltip</item>
<item name="materialThemeOverlay">@style/ThemeOverlay.Slider</item>
</style>
<style name="My_Tooltip" parent="Widget.MaterialComponents.Tooltip">
<!-- background color of the Tooltip -->
<item name="backgroundTint">@color/...</item>
</style>
<style name="ThemeOverlay.Slider" parent="">
<!-- color used by the text in the Tooltip -->
<item name="colorOnPrimary">@color/...</item>
</style>
要自定义标签中的值,您可以 LabelFormatter
.
类似于:
RangeSlider slider = findViewById(R.id.slider);
slider.setLabelFormatter(new LabelFormatter() {
@NonNull
@Override
public String getFormattedValue(float value) {
//It is just an example
if (value == 3.0f)
return "TEST";
return String.format(Locale.US, "%.0f", value);
}
});
关于标签的 行为 只有这些值(1.2.0-beta01
和 1.3.0-alpha01)
:
LABEL_FLOATING
:标签仅在交互时可见。它将漂浮在滑块上方,并可能覆盖此滑块上方的视图。这是默认和推荐的行为。LABEL_WITHIN_BOUNDS
:标签仅在交互时可见。标签将始终绘制在此视图的边界内。这意味着当标签不可见时,额外的 space 将在滑块上方可见。LABEL_GONE
: 永远不会绘制标签。
目前似乎无法始终显示标签。
您可以在布局或样式中使用 setLabelBehavior
方法或 labelBehavior
设置标签行为。
<com.google.android.material.slider.RangeSlider
app:labelBehavior="withinBounds"/>
如果你想改变标签的形状你可以检查这个
这应该是一个评论,但我不能评论所以在这里。
正如 Gabriele 已经告诉您的那样,您不能将标签 (TooltipDrawable
) 永久地贴在拇指上方。事实上,您应该覆盖 BaseSlider
的一些方法,但它们依赖于私有字段。
我还想(对访客)说,我不能像 Gabriele 所说的那样更改标签的文本颜色。我有版本 1.3.0-alpha01
。
我不得不重新设置另一个组件的样式,TextAppearance.MaterialComponents.Tooltip
.
my_layout.xml
<com.google.android.material.slider.Slider
...
app:labelStyle="@style/MyTooltip"
...
/>
res/values/styles.xml:
<style name="MyTooltip" parent="Widget.MaterialComponents.Tooltip">
<item name="backgroundTint">...</item>
<item name="android:textAppearance">@style/MyTooltip.TextAppearance</item>
</style>
<style name="MyTooltip.TextAppearance" parent="@style/TextAppearance.MaterialComponents.Tooltip">
<item name="android:textColor">...</item>
<item name="android:fontFamily">...</item>
<item name="fontFamily">...</item>
<item name="android:textSize">...</item>
</style>
我想跟进 Gabrielle,特别是重新标记 Material 滑块。
当实施类似的东西时:
RangeSlider slider = findViewById(R.id.slider);
slider.setLabelFormatter(new LabelFormatter() {
@NonNull
@Override
public String getFormattedValue(float value) {
//It is just an example
if (value == 3.0f)
return "TEST";
return String.format(Locale.US, "%.0f", value);
}
});
一定要正确判断Slider的类型。如果您使用 material.Slider,则需要将 RangeSlider
更改为 Slider
,因为 Android 无法自动为您转换数据类型。