自定義 SlidingNumberPicker 控件初始化時,顯示區域出現兩條數據同時被選中(高亮)的異常現象,影響用戶體驗。
在 onMeasure() 方法中,控件根據父容器測量規格獲取寬高。原代碼可能直接使用父容器建議的高度,導致可見項數計算錯誤。當可見項數為偶數時,中間無單一居中項,造成兩條同時高亮。
強制設置控件高度為 項數 × 單項高度,確保可見項數為奇數,始終存在唯一居中選中項。
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// 期望顯示的項數(建議奇數:5, 7, 9)
final int VISIBLE_ITEM_COUNT = 5;
int width = MeasureSpec.getSize(widthMeasureSpec);
// 關鍵修正:高度 = 項數 × 單項高度,而非依賴父佈局建議
int height = VISIBLE_ITEM_COUNT * mItemHeight;
setMeasuredDimension(width, height);
// 通知子視圖測量
measureChildren(
MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
MeasureSpec.makeMeasureSpec(mItemHeight, MeasureSpec.EXACTLY)
);
}
mItemHeight 需在構造函數或 init 中根據字體大小、間距預先計算修正後,控件初始化時僅中間一條數據高亮選中,滾動停穩時新選中項平滑移至中心,視覺效果符合預期。
此問題典型反映了自定義 View 測量流程理解不足,掌握 onMeasure 協商機制是開發高質量自定義控件的關鍵。