【问题标题】:Layer-List with items having top/bottom properties具有顶部/底部属性的项目的图层列表
【发布时间】:2017-02-01 23:28:00
【问题描述】:

我正在尝试按如下方式自定义 SeekBar 的视图:

<SeekBar
    android:id="@id/seek_bar_player"
    android:layout_width="match_parent"
    android:layout_height="6pt"
    android:paddingLeft="0pt"
    android:paddingRight="0pt"
    android:paddingStart="0pt"
    android:paddingEnd="0pt"
    android:layout_marginBottom="-2pt"
    android:layout_above="@id/player_container"
    android:progressDrawable="@drawable/seekbar_progress"
    android:thumb="@drawable/seekbar_thumb"
    android:padding="0pt"
    />

seekbar_progress.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:bottom="2pt"
        android:top="2pt">
        <color android:color="@color/seekbarBackground" />
    </item>

    <item
        android:id="@android:id/progress"
        android:bottom="2pt"
        android:top="2pt">
        <clip>
            <color android:color="@color/seekbarProgressBackground" />
        </clip>
    </item>
</layer-list>

而 seekbar_thumb.xml 的内容是,

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:width="2pt"
        android:height="6pt">
        <color android:color="@android:color/holo_red_dark" />
    </item>
</layer-list>

这会在 API 25 虚拟设备上产生所需的结果,如下所示:

但是,它在带有 Android 5.1.1(API 级别 22)的 Levovo Vibe C 上的结果很奇怪:

这可能是什么原因?任何建议都非常感谢。

【问题讨论】:

  • 您使用pt的任何原因?而不是dp
  • @weston 实际上,不...
  • 好的,这不是问题,但您通常应该使用dp。你应该看看差异。

标签: android android-layout layer-list


【解决方案1】:

原因是 item android:widthandroid:height 直到 API23 才可用。请留意 Android Studio 以获取以下提示:

因此,在较旧的 API22 设备上,它的行为就像您根本没有设置它们一样。

这是seekbar_thumb.xml 文件的替代方案:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="rectangle">
    <solid android:color="@android:color/holo_red_dark"/>
    <size
        android:width="2pt"
        android:height="6pt"/>
</shape>

厚度差异可能归结于使用pt 而不是dp,请参阅hereandroid documentation

seekbar_progress.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="@color/seekbarBackground"/>
    <!-- secondary progress optional -->
    <item android:id="@android:id/secondaryProgress">
        <scale
            android:drawable="#00ffff"
            android:scaleWidth="100%"/>
    </item>
    <item android:id="@android:id/progress">
        <scale
            android:drawable="@color/seekbarProgressBackground"
            android:scaleWidth="100%"/>
    </item>
</layer-list>

不要在该文件中完全指定尺寸。

用法:

<SeekBar
    ...
    android:maxHeight="2pt"
    android:progressDrawable="@drawable/seekbar_progress"
    android:thumb="@drawable/seekbar_thumb"
    />

maxHeight 限制了条的高度,但不限制拇指。

我再次强烈建议您使用 dp 而不是 pt,除非您有充分的理由。

【讨论】:

  • 这解释了为什么拇指几乎看不见,谢谢。但是为什么progressDrawable这么厚呢?顶部,底部等是否有类似的问题?还有,如何设置拇指的大小?
  • 我已经添加了我会这样做的方式。
  • 这样也能解决进度区的厚度问题吗?
  • 我会将厚度归结为ptdp 之间的差异。尝试全部替换为 dp 值。
  • 您的形状建议使拇指可见,谢谢。但是,seekbar_progress.xml 中的 topbottom 属性似乎在 API 22 上被忽略了,即它的高度与拇指的高度相同,因此它很厚。你对此有什么建议吗?
猜你喜欢
  • 2015-03-03
  • 2015-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-13
  • 1970-01-01
  • 1970-01-01
  • 2019-12-17
相关资源
最近更新 更多