標(biāo)簽欄是一個(gè)非常常見的控件,似乎也是一個(gè)比較簡(jiǎn)單的控件,但如果在標(biāo)簽下方加個(gè)下劃線的話,就還是可以玩出挺多花來的。
在北辰等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站制作、成都網(wǎng)站建設(shè) 網(wǎng)站設(shè)計(jì)制作按需定制,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站設(shè)計(jì),全網(wǎng)營銷推廣,成都外貿(mào)網(wǎng)站建設(shè),北辰網(wǎng)站建設(shè)費(fèi)用合理。網(wǎng)易嚴(yán)選的標(biāo)簽欄就做的很不錯(cuò),里面隱藏著諸多細(xì)節(jié):
仔細(xì)分析下,需要在簡(jiǎn)單標(biāo)簽欄的基礎(chǔ)上實(shí)現(xiàn)以下邏輯:
我做了一個(gè)樣例程序,其中的較難點(diǎn)在于計(jì)算下劃線的位置,和下劃線的動(dòng)畫效果。
// 根據(jù)當(dāng)前選定的tab,得到indicator應(yīng)該移動(dòng)到的位置 private PairgetIndicatorTargetLeftRight(int position, float positionOffset) { View tab = tabsContainer.getChildAt(position); Pair indicator = getIndicatorLeftRight(tab); float targetLeft = indicator.first; float targetRight = indicator.second; // 如果positionOffset不為0,indicator正處于兩個(gè)tab之間,需進(jìn)行加權(quán)計(jì)算得到它的位置 if (positionOffset > 0f && position < tabCount - 1) { View nextTab = tabsContainer.getChildAt(position + 1); Pair indicatorForNextTab = getIndicatorLeftRight(nextTab); float left = indicatorForNextTab.first; float right = indicatorForNextTab.second; targetLeft = (positionOffset * left + (1f - positionOffset) * targetLeft); targetRight = (positionOffset * right + (1f - positionOffset) * targetRight); } return new Pair<>(targetLeft, targetRight); } private Pair getIndicatorLeftRight(View tab) { float left = tab.getLeft(); float right = tab.getRight(); if (indicatorMode == IndicatorMode.WRAP && tab instanceof TextView) { TextView tabTextView = (TextView) tab; paint.setTextSize(tabTextView.getTextSize()); float textLength = paint.measureText(tabTextView.getText().toString()); float middle = (left + right) / 2f; left = middle - textLength / 2f; right = middle + textLength / 2f; } return new Pair<>(left, right); }