首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

ScrollerNumberPicker 默認顯示兩條被選中問題解決:onMeasure 高度計算修正

     編輯:程式設計綜合問答

問題現象

自定義 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)
    );
}

設計原則

  1. 奇數項原則:滾動選擇器可見區域項數必須為奇數,保證幾何中心唯一
  2. 自測量優先:自定義 View 應主動聲明期望尺寸,而非被動接受父佈局分配
  3. 單項高度固定:mItemHeight 需在構造函數或 init 中根據字體大小、間距預先計算

驗證效果

修正後,控件初始化時僅中間一條數據高亮選中,滾動停穩時新選中項平滑移至中心,視覺效果符合預期。

此問題典型反映了自定義 View 測量流程理解不足,掌握 onMeasure 協商機制是開發高質量自定義控件的關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved