Android:SeekBar与自定义drawable

Mic*_*hal 25 android android-layout android-seekbar android-custom-drawable

我有自定义绘图的SeekBar.Progress元素不是从左侧精确渲染,而是向右移动.我怎么能避免这个?

在此输入图像描述

<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"/>
Run Code Online (Sandbox Code Playgroud)

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/seekbar_background"/>
    <item android:id="@android:id/progress">
        <clip android:drawable="@drawable/seekbar_progress" />
    </item>

</layer-list>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

编辑:

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

Dav*_*jak 15

我无法解释为什么这是绘制笔画时的问题,我认为它与笔画宽度有关,但我还没有找到要验证的来源.

修复叠加层

要解决手头的问题,您只需inset在左侧设置即可.将正确绘制工作和搜索栏的值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>
Run Code Online (Sandbox Code Playgroud)


San*_*t A 7

意见

当您使用shape drawable创建一条线时,它会留下左右填充(从使用此drawable的视图中).等于其笔触宽度的一半.

解决方法

您需要使用插入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" />
Run Code Online (Sandbox Code Playgroud)

你的最终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>
Run Code Online (Sandbox Code Playgroud)

候补

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 -->
Run Code Online (Sandbox Code Playgroud)

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

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>
Run Code Online (Sandbox Code Playgroud)

在这里,我使用了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" />
Run Code Online (Sandbox Code Playgroud)

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