最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

android TabLayout的指示器寬度問題

 更新時間:2018年04月09日 08:38:14   作者:CysionLiu  
這篇文章主要介紹了android TabLayout的指示器寬度問題,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

最近碰到一個需求,因為是我比較感興趣的TabLayout的,所以記錄一下吧。

  1. 產(chǎn)品需求:希望上部導航欄中的指示器寬度略大于文字寬度;
  2. 技術方案:TabLayout配合ViewPager;
  3. 問題分析: 原生TabLayout的指示器寬度等于每個tab的寬度,遠大于 tab內(nèi)文字標題的寬度。

原因分析:

TabLayout(TL)繼承自HorizontalScrollView,其只能添加一個子控件,這個子控件便是TL內(nèi)部私有類–SlidingTabStrip,其繼承自LinearLayout。指示器怎么加上的呢?便是在該類的onDraw方法中:

 @Override
public void draw(Canvas canvas) {
 super.draw(canvas);
 // Thick colored underline below the current selection
 if (mIndicatorLeft >= 0 && 
 mIndicatorRight > mIndicatorLeft) {
  canvas.drawRect(mIndicatorLeft, 
 mIndicatorRight, getHeight(), 
 mSelectedIndicatorPaint);
 }
}

即指示器是與這個SlidingTabStrip容器伴生存在,其寬度,由mIndicatorLeft和mIndicatorRight確定,而這二者,由tab的寬度決定,因為本文不會詳細描述TL的源碼,所以這里直接報出結論:這個指示器的寬度設置由tab寬度決定,而tab在mode=fix情況下,是符合linearLayout中weight控制的,因此,也沒法通過tab的寬度來影響指示器的寬度,比較囧的是,源碼中也沒給tab設置個Margin什么的,另外,源碼中也沒有暴露set等方法來改變指示器寬度,否則也不會有此問題了。

解決方案1:

百度的方案基本集中在反射,使用麻煩,有時還不好用。

這個的思路來自stackoverflow,大致過程是 由TL拿到其唯一的子類,即SlidingTabStrip,然后遍歷再拿到其各子View,然后為每個子View設置Margin,這就相當于給每個tab設置margin,那么指示器的寬度自然也就跟著改變了。show code:

public static void reduceMarginsInTabs(TabLayout tabLayout, int marginOffset) {
  View tabStrip = tabLayout.getChildAt(0);
  if (tabStrip instanceof ViewGroup) {
   ViewGroup tabStripGroup = (ViewGroup) tabStrip;
   for (int i = 0; i < ((ViewGroup) tabStrip).getChildCount(); i++) {
    View tabView = tabStripGroup.getChildAt(i);
    if (tabView.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) {
     ((ViewGroup.MarginLayoutParams) tabView.getLayoutParams()).leftMargin = marginOffset;
     ((ViewGroup.MarginLayoutParams) tabView.getLayoutParams()).rightMargin = marginOffset;
    }
   }
  tabLayout.requestLayout();
  }
 }

這種方式的限制是:最多只能讓指示器與tab等寬,無法繼續(xù)減小指示器的寬度。

解決方案2:

本方案屬于自定制指示器顯示,相對比較靈活,能解決方案1的tab等寬問題,但是其缺點是不能保留指示器的動畫。具體過程:

TL中tab可以設置自定義view,方法是setCustomView(@Nullable View view) ,也就是說,完全可以不用TL中那套,直接自定義布局即可。在tab源碼的update方法中有這么一句:

 mCustomTextView = (TextView) custom.findViewById(android.R.id.text1);
 if (mCustomTextView != null) {
  mDefaultMaxLines = TextViewCompat.getMaxLines(mCustomTextView);
 }
 mCustomIconView = (ImageView) custom.findViewById(android.R.id.icon);

里面的android.R.id.text1和android.R.id.icon就是TL中tab能跟隨滑動改變狀態(tài)的兩個view的id,我們自定義的時候可以讓對應的view也這么設置id即可。而指示器,大可屏蔽原生TL的,直接在自定義布局的合適位置,加個view就行。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Android Studio中的Gradle依賴深入講解

    Android Studio中的Gradle依賴深入講解

    Android Studio由于使用了gradle的進行項目構建,使我們開發(fā)app方便很多,下面這篇文章主要給大家介紹了關于Android Studio中Gradle依賴的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2018-09-09
  • Android設計模式之Builder模式詳解

    Android設計模式之Builder模式詳解

    這篇文章主要為大家詳細介紹了Android設計模式之Builder模式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • android自定義控件ImageView實現(xiàn)圓形圖片

    android自定義控件ImageView實現(xiàn)圓形圖片

    這篇文章主要為大家詳細介紹了android自定義控件ImageView實現(xiàn)圓形圖片,適用于用戶頭像,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Android app開發(fā)中的Fragment入門學習教程

    Android app開發(fā)中的Fragment入門學習教程

    這篇文章主要介紹了Android app開發(fā)中的Fragment入門學習教程,包括Fragment的創(chuàng)建和XML布局文件中的Fragment定義等,需要的朋友可以參考下
    2016-02-02
  • Android編程之圖片顏色處理方法

    Android編程之圖片顏色處理方法

    這篇文章主要介紹了Android編程之圖片顏色處理方法,涉及Android針對圖片的顏色值、飽和度、透明度等處理技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-10-10
  • Android中區(qū)別Drawable Bitmap Canvas Paint

    Android中區(qū)別Drawable Bitmap Canvas Paint

    本文主要介紹Android中Drawable Bitmap Canvas Paint 之間的區(qū)別,這里對這幾個概念做出詳細介紹,開發(fā)Android游戲的朋友可以參考下
    2016-07-07
  • android第三方分享方式的簡單實現(xiàn)

    android第三方分享方式的簡單實現(xiàn)

    這篇文章主要為大家詳細介紹了android第三方分享方式的簡單實現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • Android搶紅包插件實現(xiàn)原理淺析

    Android搶紅包插件實現(xiàn)原理淺析

    這篇文章主要為大家詳細介紹了Android搶紅包插件的實現(xiàn)原理,由淺入深的幫助大家分析Android搶紅包的原理,感興趣的小伙伴們可以參考一下
    2016-06-06
  • Android保持屏幕常亮2種實現(xiàn)方法

    Android保持屏幕常亮2種實現(xiàn)方法

    這篇文章主要介紹了Android保持屏幕常亮2種實現(xiàn)方法,本文分別給出示例代碼,需要的朋友可以參考下
    2015-05-05
  • Android漲姿勢知識點之你沒用過的BadgeDrawable

    Android漲姿勢知識點之你沒用過的BadgeDrawable

    現(xiàn)在Android中有許多的應用仿蘋果的在應用圖標上顯示小紅點,下面這篇文章主要給大家介紹了關于Android漲姿勢知識點之你沒用過的BadgeDrawable的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-09-09

最新評論

巢湖市| 山丹县| 法库县| 岑溪市| 阳曲县| 淄博市| 宁都县| 砀山县| 萝北县| 文水县| 兰坪| 平罗县| 分宜县| 北宁市| 赤城县| 格尔木市| 永靖县| 乌海市| 安龙县| 台前县| 弥勒县| 金山区| 阿勒泰市| 岑巩县| 二连浩特市| 玛沁县| 东安县| 玉田县| 康马县| 延寿县| 天全县| 西青区| 黄冈市| 潢川县| 横山县| 玉环县| 通海县| 呼玛县| 商丘市| 泾川县| 洪洞县|