26

我有带有自定义可绘制对象的 SeekBar。进度元素不是从左侧完全呈现,而是向右移动。我怎样才能避免这种情况?

在此处输入图像描述

<SeekBar
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_below="@android:id/summary"
    android:background="@null"

    android:progressDrawable="@drawable/seekbar"
    android:thumb="@drawable/seekbar_thumb"/>

搜索栏.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:id="@android:id/background"
        android:drawable="@drawable/seekbar_background"/>
    <item android:id="@android:id/progress">
        <clip android:drawable="@drawable/seekbar_progress" />
    </item>

</layer-list>

seekbar_background.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="line">

    <stroke android:width="2dp" android:color="@color/colorNeutral" />

</shape>

seekbar_progress.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="line">

    <stroke
        android:width="4dp"
        android:color="@color/colorAccentDark" />
</shape>

编辑:

如评论中所述,如果两个宽度相同,问题就会消失。但是我需要通过drawable来制作两种不同的宽度,这可能吗?也许有不同的形状而不仅仅是线条?

4

6 回答 6

15

我无法解释为什么在绘制笔画时会出现这个问题,我认为这与笔画宽度有关,但我还没有找到源来验证。

修复覆盖

要解决手头的问题,您只需inset在左侧设置一个。work 和 seekbar的值1dp2dp两者都将正确绘制。

注意:使用这种方法应该没有背景可能太短并且在低进度值时不可见的风险,因为在任何情况下拇指都会覆盖并隐藏它。

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@android:id/background"
        android:drawable="@drawable/seekbar_background"
        android:left="2dp"><!-- or 1dp -->
    </item>
    <item android:id="@android:id/progress">
        <clip android:drawable="@drawable/seekbar_progress"/>
    </item>
</layer-list>
于 2016-01-24T20:05:15.463 回答
7

观察

当您使用可绘制形状创建一条线时,它会留下左右填充(从使用此可绘制对象的视图中)等于其笔划宽度的一半。

解决方法

您需要使用 inset drawable 包装您的 progress_background,然后将其设置为进度背景。插图可以如下所示 -

inset_seekbar_background.xml

<inset xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/seekbar_progress"
    android:insetLeft="2dp"
    android:insetRight="2dp" />

你最终的 seekbar.xml 会像 -

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:id="@android:id/background"
        android:drawable="@drawable/inset_seekbar_background"/>
    <item android:id="@android:id/progress">
        <clip android:drawable="@drawable/seekbar_progress" />
    </item>

</layer-list>

替补

1.您可以使用 9 路径图像作为线条,就像在默认材料设计中所做的那样 -

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@android:id/background"
        android:drawable="@drawable/abc_scrubber_primary_mtrl_alpha" />
    <item android:id="@android:id/secondaryProgress">
        <scale android:scaleWidth="100%">
            <selector>
                <item android:state_enabled="false">
                    <color android:color="@android:color/transparent" />
                </item>
                <item android:drawable="@drawable/abc_scrubber_primary_mtrl_alpha" />
            </selector>
        </scale>
    </item>
    <item android:id="@android:id/progress">
        <scale android:scaleWidth="100%">
            <selector>
                <item android:state_enabled="true">
                    <color android:color="@android:color/transparent" />
                </item>
                <item android:drawable="@drawable/abc_scrubber_primary_mtrl_alpha" />
            </selector>
        </scale>
    </item>
</layer-list><!-- From: file:/usr/local/google/buildbot/src/googleplex-android/mnc-supportlib-release/frameworks/support/v7/appcompat/res/drawable/abc_seekbar_track_material.xml -->

在此处输入图像描述 在此处输入图像描述 在此处输入图像描述 在此处输入图像描述

2.您可以将主题设置为具有不同颜色的android样式的视图,如-

<style name="AppTheme.SeekBar">
        <item name="colorPrimary">@color/colorAccent</item>
        <item name="colorPrimaryDark">@color/colorPrimary</item>
        <item name="colorAccent">@color/colorPrimaryDark</item>
</style>

在这里,我使用了 Seekbars 的所有选项-

            <SeekBar 
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:theme="@style/AppTheme.SeekBar" />

            <SeekBar
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />

            <SeekBar
                android:layerType="software"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:progressDrawable="@drawable/seekbar" />

这是输出 - 在此处输入图像描述

于 2016-01-28T22:38:25.587 回答
3

看来问题正在进行中,我认为它们的宽度应该相同

但你正在进行宽度= 4android:width="4dp"

和搜索栏宽度 = 2android:width="2dp"

只需将它们匹配为 2 或 4 不要使用不同的值

于 2016-01-22T00:41:12.933 回答
3

尝试使用宽度为 4dp (converted to px) 的 .9.png 可绘制对象。

在顶部和底部保持 1 dp 透明。

并将颜色添加到您选择的中心 2 dp 作为背景。

这样背景和进度都将具有相同的宽度,但背景看起来会比进度条更薄。

于 2016-01-28T01:04:21.513 回答
2

尝试这样使用 android:layout_marginLeft="-3dp"-2dp

<SeekBar
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_below="@android:id/summary"
    android:background="@null"
    android:layout_marginLeft="-2dp"
    android:progressDrawable="@drawable/seekbar"
    android:thumb="@drawable/seekbar_thumb"/>`
于 2016-01-28T10:58:06.570 回答
2

如果您的颜色选择有限制并且是预定义的。您可以尝试使用不同主题的 Seekbars 添加 XML 文件。

像这样的东西:

theme_seekbar_one.xml

<?xml version="1.0" encoding="utf-8"?>
<SeekBar
    ...
    android:theme="@style/first_theme">
</SeekBar>

theme_seekbar_two.xml

<?xml version="1.0" encoding="utf-8"?>
<SeekBar
    ...
    android:theme="@style/second_theme">
</SeekBar>

然后,您可以像这样以编程方式扩充视图:

SeekBar seekbar = (SeekBar)getLayoutInflater().inflate(R.layout.themed_seekbar_xxx, null);
于 2016-01-29T16:02:33.687 回答