SeekBar簡介
SeekBar是Android中的一個可交互UI組件,允許用戶通過拖動滑塊在特定范圍內選擇數值。繼承自ProgressBar,但增加了用戶手動調節功能,常用于音量控制、亮度調節等場景。
核心屬性
android:maxHeight // 背景高度
android:progressDrawable // 進度條背景
android:thumb // 滑塊
android:splitTrack // hua塊 是否切割 seekbar 背景,默認true,會看到thumb周圍區域被切割
android:thumbOffset // 控制滑塊初始位置
android:paddingStart // 控制滑塊左右空白部分
SeekBar滑塊顯示文字
公司的UI出了一個效果圖,在seekbar的滑塊上顯示進度文字,效果如圖:
效果還是很不錯的,可是實現起來難呀,咋辦,別擔心,慢慢干。
顯示文字的需求可以通過自定義seekbar的thumb(滑塊)的方式實現,也可以重寫seekbar的ondraw方法實現,這里我選擇第二種方式
package com.htfyun.systemui.widget;import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.widget.SeekBar;public class HtSeekBar extends SeekBar {private static final String TAG = "HtSeekBar";private Paint textPaint = new Paint();private Rect rect = new Rect();public HtSeekBar(android.content.Context context, android.util.AttributeSet attrs) {super(context, attrs);textPaint.setColor(Color.WHITE);textPaint.setTextSize(18);textPaint.setDither(false);}@Overrideprotected synchronized void onDraw(Canvas canvas) {super.onDraw(canvas);int save = canvas.save();String text = String.valueOf(getProgress());textPaint.getTextBounds(text, 0, text.length(), rect);float p = 1f * getProgress() / (getMax() - getMin());float x = (getWidth() - getPaddingStart()) * p - rect.centerX() + getPaddingStart() * (1 - p);float y = 1f * getHeight() / 2 - rect.centerY();canvas.drawText(text, x, y, textPaint);canvas.restoreToCount(save);}
}
寫一個xml實現progressDrawable
<?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><corners android:radius="10dp" /><solid android:color="#FFF" /><strokeandroid:width="1dp"android:color="#4B5563" /></shape></item><item android:id="@android:id/progress"><clip><shape><corners android:radius="10dp" /><solid android:color="#4B5563" /></shape></clip></item><item android:id="@android:id/secondaryProgress"><clip><shape><corners android:radius="10dp" /><solid android:color="#4B5563" /></shape></clip></item>
</layer-list>
在layout布局文件中引用就是了
<com.htfyun.systemui.widget.HtSeekBarandroid:id="@+id/sbVolume"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_alignTop="@id/tvVolume"android:layout_alignBottom="@id/tvVolume"android:layout_marginRight="16dp"android:layout_toRightOf="@id/tvVolume"android:max="@integer/seekbarMax"android:maxHeight="16dp"android:progress="15"android:progressDrawable="@drawable/seekbar"android:splitTrack="false"android:thumb="@drawable/thumb" />
ok,完工。