seekBar.setThumb之后导致thumb变小的原因

本文探讨了在Android应用开发中,使用BitmapDrawable设置SeekBar thumb时,遇到的大小显示差别问题。通过对比不同设置方法,揭示了Bitmap在绘制到Drawable时未处理Density的影响,并提供了解决方案。

由于要实现下述的效果:

通过以下方法:

方法1:

Bitmap bitmap = BitmapUtil.drawIndexOnBitmap(R.drawable.activity_seek_bar_thumb, "1");
		mOldThumbDrable =  new BitmapDrawable(bitmap);
	    mSeekBar.setThumb(mOldThumbDrable);
		mSeekBar.setThumbOffset(0);
对thumb进行重新设置时,出现了如下效果:


发现在代码中进行上诉设置与在xml中进行设置时,thumb的大小显示差别很大:

方法2:

xml布局

<SeekBar
            android:id="@+id/seek_bar"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:maxHeight="15dip"
            android:minHeight="15dip"
            android:paddingLeft="5dip"
            android:paddingRight="5dip"
            android:layout_gravity="center_vertical"
            android:progressDrawable="@drawable/activity_page_center_line"
            android:thumbOffset="0dip"
            android:thumb="@drawable/activity_seek_bar_thumb"/>

方法3:

然后我又尝试用下述的代码进行设置:

mOldThumbDrable =getResources().getDrawable(R.drawable.activity_seek_bar_thumb);
 mSeekBar.setThumb(mOldThumbDrable);
结果发现显示正常,和在xml中的布局一样
为什么2,3的能显示正常,1显示那么小?

我下来调试了

drawIndexOnBitmap

方法,发现一下截图:

调试前的drawable:


调试后的:


注意红色的地方,发现尺寸大小变化了,而且应该和Density有关,所以查看了方法1中的

 /**
     * Create drawable from a bitmap, not dealing with density.
     * @deprecated Use {@link #BitmapDrawable(Resources, Bitmap)} to ensure
     * that the drawable has correctly set its target density.
     */
    @Deprecated
    public BitmapDrawable(Bitmap bitmap) {
        this(new BitmapState(bitmap), null);
    }

发现,当在bitmap上画完数字后,通过得到的bitmap构造drawable时,改方法提示了not dealing with density至此,我们找到了原因,所以改用

BitmapDrawable(Resources, Bitmap)
方法即可


结果发现thumb的图标太小,但是

<think>好的,我现在需要帮用户解决关于Android SeekBar设置进度的问题。用户想知道如何使用SeekBar的setProgress方法以及相关属性。首先,我得回忆一下SeekBar的基本用法,确保自己理解正确。 首先,SeekBar是ProgressBar的子类,所以它继承了setProgress方法。用户可能需要知道如何设置当前进度值。记得这个方法可以在代码中调用,比如seekBar.setProgress(50)。同,可能还要提到可以在XML布局文件中设置初始进度,使用android:progress属性。 接下来,用户可能关心的是属性,除了progress之外,还有max属性,这个决定了SeekBar最大值,默认是100。比如设置max为200,这样进度范围就是0到200。还有android:secondaryProgress,这个用于显示次要进度,比如缓冲条。 然后,用户可能想知道如何监听进度变化。这候需要用到OnSeekBarChangeListener接口,实现onProgressChanged方法。这里要注意,如果是从代码中设置进度,可能需要控制是否触发监听器,所以setProgress方法有个参数可以控制是否调用监听器,比如setProgress(50, true)。 然后,考虑用户可能的实际应用场景,比如媒体播放器的进度条或者音量控制。这候可以举一个简单的例子,比如拖动SeekBar改变进度,同更新TextView显示当前值。代码示例应该包括布局中的SeekBar和TextView,然后在Activity中绑定控件,设置监听器。 另外,需要注意线程的问题,如果在子线程中更新进度,必须使用runOnUiThread或者Handler来操作UI。比如在下载进度更新,避免在非UI线程直接调用setProgress。 还有,用户可能遇到的问题,比如设置进度不生效,这候需要检查是否在UI线程操作,或者是否正确绑定了控件。同,如果自定义样式的话,可能需要检查样式属性是否正确应用。 最后,根据用户提供的引用,虽然引用中的内容是关于其他库的配置,但可能用户是从其他问题跳转过来的,需要确保回答中引用的正确性。不过当前问题中没有直接相关的引用,可能用户提供的引用是误贴,但按照要求还是在末尾加上引用标识。 总结一下,回答的结构应该是先介绍setProgress的用法,包括代码和XML,然后讲解相关属性,接着是监听器的使用,再给出一个示例,最后提醒注意事项和常见问题。这样用户能逐步了解如何正确使用SeekBar。</think>### Android SeekBar设置进度的方法与属性 #### 1. **设置进度值** - **`setProgress(int progress)`**: 通过代码动态设置当前进度值。 ```java SeekBar seekBar = findViewById(R.id.seekBar); seekBar.setProgress(50); // 设置进度值为50 ``` - **XML属性 `android:progress`**: 在布局文件中定义初始进度。 ```xml <SeekBar android:id="@+id/seekBar" android:layout_width="match_parent" android:layout_height="wrap_content" android:progress="30" /> <!-- 初始进度为30 --> ``` #### 2. **相关属性** - **`android:max`**: 定义进度条的最大值(默认100)。 ```xml <SeekBar android:max="200" /> <!-- 进度范围0-200 --> ``` - **`android:secondaryProgress`**: 次要进度(如缓冲进度)。 ```xml <SeekBar android:secondaryProgress="60" /> ``` #### 3. **监听进度变化** 通过 `OnSeekBarChangeListener` 监听拖动事件: ```java seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { // 用户拖动触发 textView.setText("当前进度:" + progress); } @Override public void onStartTrackingTouch(SeekBar seekBar) { // 开始拖动调用 } @Override public void onStopTrackingTouch(SeekBar seekBar) { // 结束拖动调用 } }); ``` #### 4. **示例场景** **布局文件 (`activity_main.xml`)**: ```xml <SeekBar android:id="@+id/seekBar" android:layout_width="match_parent" android:layout_height="wrap_content" android:max="100" android:progress="0" /> <TextView android:id="@+id/tvProgress" android:layout_width="wrap_content" android:layout_height="wrap_content" /> ``` **Activity代码**: ```java public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); SeekBar seekBar = findViewById(R.id.seekBar); TextView tvProgress = findViewById(R.id.tvProgress); seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { tvProgress.setText("当前进度:" + progress); } // 省略其他回调方法 }); } } ``` #### 5. **注意事项** - **线程安全**: 在非UI线程更新进度需使用 `runOnUiThread`: ```java new Thread(() -> { // 模拟耗操作 runOnUiThread(() -> seekBar.setProgress(80)); }).start(); ``` - **避免多次触发监听器**: 调用 `setProgress(int progress, boolean animate)` ,第二个参数控制是否触发监听器。 #### 6. **常见问题** - **进度不更新**: 检查是否在UI线程操作或是否正确绑定控件。 - **样式异常**: 自定义SeekBar需确保轨道和拇指的Drawable配置正确[^1]。 ---
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值