【问题标题】:Unwanted padding in Android SeekBarAndroid SeekBar 中不需要的填充
【发布时间】:2019-10-02 00:21:11
【问题描述】:

我在使用 Android 搜索栏时遇到问题,搜索栏视图似乎有一个默认填充,我似乎无法删除它,我尝试将填充设置为“0dp”并尝试将边距设置为“-10dp”以查看它是否删除一些空间并尝试将背景设置为空,以防有背景占用空间但似乎没有发生任何事情,SeekBar 标记是:

<SeekBar
    android:paddingLeft="0px"
    android:paddingRight="0px"
    android:background="@null"
    android:id="@+id/musicSeekBar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

编辑:好的,经过一些测试并尝试了一些东西,我学到了这一点:

  1. 填充是由于拇指可绘制的大小
  2. 设置 android:thumb="@null" 将删除底部和顶部填充
  3. 即使我移除了拇指,左右填充仍然存在,但可以通过在两侧设置一个负边距来移除,等于默认拇指可绘制宽度除以 2,因此如果它的 32dp 将是每边 16dp 李>

现在我需要知道是否有更清洁的方法来移除填充,并且所有设备上的拇指大小是否相同?欢迎任何帮助。

【问题讨论】:

  • 设置 android:thumb="@null" 不会删除顶部和底部的填充。
  • 在 xml 中使用 android:padding="0dp" 对我有用

标签: android seekbar


【解决方案1】:

我意识到这已经晚了 3 年,但对于像我这样仍然无法找到此解决方案的人来说,就是这样。问题是拇指可绘制添加了顶部/底部填充(尝试将拇指可绘制设置为@null 并观察填充消失)。解决方案是将所有内容偏移拇指可绘制对象大小的一半。为了确保跨设备的布局保持一致,我们将创建一个自定义拇指可绘制对象,以便我们控制大小。

第 1 步:创建自定义拇指可绘制对象。

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item>
        <shape android:shape="oval">
            <size android:height="10dp" android:width="10dp" />
            <solid android:color="@color/mediaThumbColor" />
        </shape>
    </item>
</layer-list>

第 2 步:设置 SeekBar。

<SeekBar
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:thumb="@drawable/media_seekbar_thumb"
    android:paddingStart="0dp"
    android:paddingEnd="0dp"
    android:splitTrack="false"
    android:thumbOffset="5dp"
    android:elevation="4dp"
    />
  • 将拇指可绘制对象设置为我们刚刚创建的对象。
  • 设置 splitTrack=false 以解决自定义拇指可绘制对象被填充到远离栏的空白区域的问题。
  • 将开始/结束填充设置为 0 以确保它是完整的父级 宽度(SeekBar 默认有 16dp 的内边距)。
  • 将拇指偏移设置为自定义拇指可绘制大小的一半(在我们的示例中,这是 10dp,因此拇指偏移为 5dp)。
  • 给搜索栏一些高度,以确保它显示在背景内容之上(解释如下)。

第 3 步:设置媒体栏布局。

这是正确排列所有内容的关键。媒体栏将由一个顶级父布局组成,其中包含 (1) SeekBar,和 (2) 包含其他所有内容(播放/暂停、后退/前进、跟踪时间等)的内部父级。顶级父级需要具有透明背景并具有高度wrap_content。内部父级需要具有您希望媒体栏成为的任何背景颜色,以及您希望媒体栏成为的任何高度的高度。

将内部父级设置为与顶级父级顶部对齐,上边距为自定义拇指可绘制对象高度的一半案例 5dp。这会抵消媒体栏中的所有内容,以使 SeekBar 看起来正好位于其上方。

这是一个使用 ConstraintLayout 的示例。

<androidx.constraintlayout.widget.ConstraintLayout
    android:id="@+id/media_bar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@android:color/transparent"
    >

    <SeekBar
        android:id="@+id/media_bar_seekbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        android:thumb="@drawable/media_seekbar_thumb"
        android:paddingStart="0dp"
        android:paddingEnd="0dp"
        android:splitTrack="false"
        android:thumbOffset="5dp"
        android:elevation="4dp"
        />

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/media_bar_content"
        android:layout_width="match_parent"
        android:layout_height="@dimen/media_bar_height"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        android:layout_marginTop="5dp"
        android:background="@color/mediaBarColor"
        >

        <!-- All mediabar content goes here -->

    </androidx.constraintlayout.widget.ConstraintLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

【讨论】:

  • 覆盖 paddingStart 和 paddingEnd 为我工作。
【解决方案2】:

要从 Seekbar 中删除填充,您必须在运行时进行:

findViewById(R.id.seekBar).setPadding(0,0,0,0);

========================或 ================ ======

Bitmap thumbImage = BitmapFactory.decodeResource(getResources(), R.drawable.thumb);
int paddingDp = (int)(0.5f * (thumbImage.getWidth()));
findViewById(R.id.seekBar).setPadding(paddingDp,0,paddingDp,0);

您无需设置android:thumb="@null"

【讨论】:

  • 这会删除左右两边的填充。如何删除搜索栏上方和下方的填充。我不需要任何拇指,所以我将其设置为 null
  • 这是拇指的尖​​端
  • 好叫 Choletski。在父视图上设置 android:clipChildren="false" 会处理拇指剪辑。轻微的缺点是如果在 seekBar 布局的外侧(拇指外半部)触摸拇指将不会响应。这是一个小问题,这个解决方案比我针对我的情况尝试的许多其他选项效果更好。
【解决方案3】:

只需将 minHeight 设置为 0dp,它就会“移除”上方和下方的填充。

【讨论】:

    猜你喜欢
    • 2013-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-27
    • 2014-04-05
    • 1970-01-01
    • 2012-09-17
    • 2011-08-15
    相关资源
    最近更新 更多