android - 带有自定义拇指和间隔文本 Android 的 Seekbar
解决方案
我试图做一些类似于你想要的东西:
SeekBar
1 - 首先添加如下的XML :
<SeekBar
android:id="@+id/seekBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:layout_margin="10dp"
android:max="100"
android:maxHeight="4.0dp"
android:progress="60"/>
2 - 创建 2 个Drawable
文件progress_bg.xml和custom_thumb.xml:
进度_bg.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">
<shape android:shape="rectangle">
<corners android:radius="5dp"/>
<solid android:color="#e0e0e0"/>
</shape>
</item>
<item android:id="@android:id/secondaryProgress">
<scale
android:scaleWidth="100%" >
<shape android:shape="rectangle">
<corners android:radius="5dp"/>
<solid android:color="#e0e0e0"/>
</shape>
</scale>
</item>
<item android:id="@android:id/progress">
<scale
android:scaleWidth="100%" >
<shape android:shape="rectangle">
<corners android:radius="5dp"/>
<solid android:color="#2574ff"/>
</shape>
</scale>
</item>
</layer-list>
custom_thumb.xml :
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<stroke
android:width="1.5dp"
android:color="#2574ff" />
<corners
android:bottomLeftRadius="8dp"
android:bottomRightRadius="8dp"
android:topLeftRadius="8dp"
android:topRightRadius="8dp" />
<solid android:color="#fff" />
<size android:width="25dp" android:height="25dp"/>
</shape>
3 - 现在是 Java 代码,我们需要在每次更改其值时动态progressDrawable
更改以及更改拇指:SeekBar
SeekBar
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SeekBar seekBar = findViewById(R.id.seekBar);
seekBar.setThumb(getCurrentThumb(seekBar.getProgress()));
seekBar.setProgressDrawable(ResourceUtils.getDrawable(R.drawable.progress_bg));
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
seekBar.setThumb(getCurrentThumb(seekBar.getProgress()));
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
}
我试图将 thumb 转换Drawable
为Bitmap
,所以我可以在上面写一个文本,这就是我所做的:
public Drawable getCurrentThumb(int currentProgress) {
Bitmap writableBitmap = ImageUtils.drawable2Bitmap(ResourceUtils.getDrawable(R.drawable.custom_thumb));
writableBitmap = addText(writableBitmap, currentProgress);
return ImageUtils.bitmap2Drawable(writableBitmap);
}
将文本添加到Bitmap
:
public Bitmap addText(Bitmap src, int currentProgress) {
Bitmap.Config bitmapConfig = src.getConfig();
if (bitmapConfig == null) bitmapConfig = Bitmap.Config.ARGB_8888;
Bitmap bitmap = src.copy(bitmapConfig, true);
Canvas canvas = new Canvas(bitmap);
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(Color.BLACK);
paint.setStyle(Paint.Style.FILL);
paint.setTypeface(Typeface.create(Typeface.DEFAULT, Typeface.BOLD));
paint.setTextAlign(Paint.Align.CENTER);
paint.setTextSize(35);
Rect rectangle = new Rect();
paint.getTextBounds(
String.valueOf(currentProgress),
0, // start
String.valueOf(currentProgress).length(),
rectangle
);
canvas.drawText(
String.valueOf(currentProgress),
canvas.getWidth() / 2.0f,
canvas.getHeight() / 2.0f + Math.abs(rectangle.height()) / 2.0f, // y
paint // Paint
);
return bitmap;
}
使用的库:
implementation 'com.blankj:utilcodex:1.29.0'
推荐阅读
- c++ - 如何从 std::string 中删除 +
- reactjs - 上下文状态值不持久(重置为默认值)
- javascript - 如何在 Liquid Shopify 中的 for 循环内从迭代中停止网格收集
- docker - 为什么使用 PublisherInterface 向 Mercure Hub 推送更新会引发 TransferException?
- c++ - 根据公式 C++ 的系列总和
- python - Python 代码适用于 cmd 和 VScode,但不适用于 powershell 或 pyinstaller
- python - 如何在使用 NGINX 反向代理的 Django 3 中为文件上传添加进度条?
- c - 在 C 中,指针的值更改后内存值会发生什么变化?
- python - 如何在熊猫中删除缺失值的行
- python - pd.dataframe 错误我无法合并两个数据框