看到很多的APP,都有PagerSlidingTab這個控件,而且風格都不一樣,所以我決定研究一番。

1.老師給了個控件PagerSlidingTab,假如Tab只有2個的時候,標題并沒有占滿全屏。那怎改?

2.如果想要有自己的效果,那么就得理解源碼,修改源碼。
源碼怎么看:不可能全部看完,抓住主要的,自己關心的地方。否則看源碼就是一件痛苦的事情。
1)首先看PagerSlidingTab這個類的繼承關系,發現它繼承自HorizontalScrollView
-->FrameLayout-->ViewGroup。
2)看PagerSlidingTab構造函數,會發現標題其實是水平的LinearLayout,源碼中用
tabsContainer表示。
3)我想,標題沒有居中,也就是子View沒有添加權重。于是Ctrl + F,在類里搜索tabsContainer。
發現addTextTab和addIconTab兩個方法中tabsContainer會有添加子View,于是Ctrl + F,再搜索
addTextTab方法,找到方法在哪里被調用。
for (int i = 0; i < tabCount; i++) {
if (pager.getAdapter() instanceof IconTabProvider) {
addIconTab(i, ((IconTabProvider) pager.getAdapter()).getPageIconResId(i));
} else {
addTextTab(i, pager.getAdapter().getPageTitle(i).toString());
}
}發現和ViewPager的適配器有關,而平常我們會使用PagerAdapter,所以addTextTab 會被調用。
4)于是在 addTextTab 方法添加子View的時候為子View添加了權重
private void addTextTab(final int position, String title) {
TextView tab = new TextView(getContext());
tab.setText(title);
tab.setFocusable(true);
tab.setGravity(Gravity.CENTER);
tab.setSingleLine();
//我給子View添加的權重
tab.setLayoutParams(new LinearLayout.LayoutParams(0,LayoutParams.MATCH_PARENT,1.0f));
tab.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
pager.setCurrentItem(position);
}
});
tabsContainer.addView(tab);
}5)但是遺憾的是,運行結果還是一個樣。那怎么辦?
后來在onMeasure方法中發現了驚天大秘密:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
if (!shouldExpand || MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.UNSPECIFIED) {
return;
}
int myWidth = getMeasuredWidth();
int childWidth = 0;
for (int i = 0; i < tabCount; i++) {
childWidth += tabsContainer.getChildAt(i).getMeasuredWidth();
}
if (!checkedTabWidths && childWidth > 0 && myWidth > 0) {
if (childWidth <= myWidth) {
for (int i = 0; i < tabCount; i++) {
tabsContainer.getChildAt(i).setLayoutParams(expandedTabLayoutParams);
}
}
checkedTabWidths = true;
}
}發現在此方法里其實就是對我所說的這個問題的控制,shouldExpand 就是控制標題是否平均分配
而這個屬性在XML或者set方法里都可以設置。默認是false,不會平均分配。
雖然繞來繞去,改個屬性就能解決問題,但還是收獲不少。
3.PagerSlidingTab的其他屬性
<declare-styleable name="PagerSlidingTab">
<attr name="indicatorColor" format="color" /> 指針也就是滑動塊的顏色
<attr name="underlineColor" format="color" /> 滑動條與View之間那條線顏色
<attr name="underlineHeight" format="dimension" /> 滑動條與View之間那條線高度
<attr name="dividerColor" format="color" /> 滑動塊之間豎直分隔線
<attr name="indicatorHeight" format="dimension" /> 滑動塊的高度
<attr name="pst_dividerPadding" format="dimension" />
<attr name="tabPaddingLeftRight" format="dimension" />
<attr name="scrollOffset" format="dimension" />
<attr name="tabBackground" format="reference" />
<attr name="shouldExpand" format="boolean" /> 導航條是否平均分配寬度
<attr name="pst_textAllCaps" format="boolean" />
</declare-styleable>
還有和字體顏色和大小相關的屬性,并沒有寫在attrs.xml中,不過可以通過set方法進行設置,上面
的屬性也都有對應的set方法。
源碼中
tab.setTextColor(i==0?getResources().getColor(R.color.slidingtab_indicatorcolor):tabTextColor);
就是設置字體的顏色,即當前導航條字體顏色與其它導航條字體顏色。
另外有一點讓人費解的就是導航條的背景色怎么設置的?
app:tabBackground="@color/gray"
只要給導航條添加了背景色,下面的滑動塊就不顯示了,求路過的幫忙解答一下啊?
另外有需要云服務器可以了解下創新互聯scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業上云的綜合解決方案,具有“安全穩定、簡單易用、服務可用性高、性價比高”等特點與優勢,專為企業上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
新聞標題:PagerSlidingTab定制自己的樣式-創新互聯
鏈接地址:http://www.yijiale78.com/article12/deoegc.html
成都網站建設公司_創新互聯,為您提供網站建設、虛擬主機、定制開發、App設計、云服務器、營銷型網站建設
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯