SeekBar自定义 - 如何正确定位自定义的“拇指”图像?

8
我已经自定义了SeekBar - 我使用自定义图像作为背景,并使用自定义图像作为滑块(如如何在Android中创建自定义SeekBar?如何自定义SeekBar的外观?)。
我的想法是创建一个SeekBar,其外观类似于此图像: enter image description here 当设置progress值为0或100(百分比)时,我希望滑块图像完美地适应圆形条中。
为了正确定位滑块(即不重叠于条的两端),我已将paddingLeftpaddingRight的值设置为滑块宽度的一半(参见Android:SeekBar无法滚动到最后)。
.../res/layout/main.xml:
<SeekBar android:id="@+id/frequency_slider"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"
    android:max="100" android:progress="0"
    android:progressDrawable="@drawable/seekbar_no_visible_progress"
    android:thumb="@drawable/seekbar_thumb" <!-- this is an image -->
    android:background="@drawable/hos_bar" <!-- this is an image -->
    android:paddingLeft="24dp"
    android:paddingRight="24dp">
</SeekBar>

这个在Android 2.1版本中可以使用。


在Android 2.2版本中会产生不同的效果:

enter image description here


经过进一步调查(并尝试使用完全默认的SeekBar),我发现拇指图像的位置从2.1改变到了2.2。我的hack改变paddingLeftpaddingRight不是问题所在。

  • 在2.1中,拇指围绕条形末端居中,拇指的一半在条上,一半在条外。
  • 在2.2中,拇指位于条内,没有重叠。因此,填充值产生的奇怪效果就出现了。这正是我想要的效果,但是当使用自定义拇指时,这种效果不再起作用。

我认为我需要创建一个自定义的Java类来处理这种类型的问题。在这个问题中(Possible to do rounded corners in custom Progressbar progressDrawable?),开发者使用了一个ClipDrawable来制作一个标准的进度条。

我应该使用什么类型的Drawable对象,以及如何才能正确地定位我的拇指?

4个回答

10
seekbar.setThumbOffset(0);

在运行时。 不是从XML中获取!

对我解决了问题。


5

thumbOffset参数在这两个版本之间的行为已经发生了变化。ThumbOffset确定拇指图像的实际偏移量,与提供的位置参数进行比较。


1

尝试使用这个:

<SeekBar android:id="@+id/seek"
         android:layout_width="fill_parent"
        android:layout_height="73dip"
        android:max="80"
        android:progress="12"
        android:maxWidth="273dip"
        android:maxHeight="73dip"
        android:secondaryProgress="255"   
        android:background="@drawable/image2"       <!-- this is an image -->  
        android:progressDrawable="@drawable/image1" <!-- this is an image -->
        android:thumb="@drawable/lock_thumb"                             
        />

我已经尝试过这个方法,对于2.1和2.2版本来说完美运行。

在你的情况下,尝试像我一样调整maxWidth、max和progress,并尝试移除填充。这可能有助于解决问题。

enter image description here


谢谢。我已经更新了我的问题。我不想要的效果仍然存在(标准SeekBar上也是如此)。当进度值设置为0或最大值时,我希望拇指图像能够很好地适应条的每个圆形端部。 - Richard Le Mesurier

1

终于找到了答案,这里的情况是你必须使用 android:thumbOffset,但是 android:thumbOffset不是用于设置拇指在进度条上的位置,而是拇指长度其开始其中心点,以便 seekbar 可以在其起始点调整拇指的中心点。因此,如果我们有一个宽度为50的拇指图像,则 thumbOffset 必须为25(50/2),这样 seekbar 将在拇指的第 25 个像素处调整零值,使拇指看起来恰好位于中间。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接