下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、擰恥和演技井飢拒硼斑剜- jgU不必*4磚歲仍獨守空房20it內(nèi)地黑房破 m 億比去年WtUiiOO萬簡單使用恥幻的下 Tt 皈齊正住畫母更魏也幵炭當中=啟管 在爺陋車中,很多慨柞苻丼未友生窪代.可現(xiàn) 隸時 It(absHvabr creatiDnh訂冋理(su bEfiptiofimanagement)(hackpressure)林&行 了站氏沏曜堆改迸.在辛決 GOTO Copan 貼鈔A加圧的融演 中,蟲賑將焦訶嵌蟲褲 2 遲行了月神改進,戲段電些 改逍甘聞的犀區(qū)淡將學習*1 誦如何將驚三方躍抑應用 同時違移到取上沖 2 耳申,以段謹帕何在訴介 R*Jp 辟 版客之間亙用環(huán)添加庫
2、依賴dependencies compile com.astuetz:pagerslidingtabstrip:1.0.1 定義布局文件vcom.astuet z. PagerSlidingTabStrip android:id=+id/psts_i ndicatorandroid:layout_width=match_parent android:layout_height=40dp/關聯(lián) ViewPagerpublic class MainActivity extends AppCompatActivity BindView(R.id.psts_indicator)PagerSliding
3、TabStrip從頭到腳fl N% M 28QRflLU*H4RR災吉障挾菁襲201$年竄可確醴獎Android方便的憐移 MtWJ 序詞帶諜記置到遠用岡?UTi#琨非*1 的 D59er2 入門 It 畀,miicSjH瑕陰上蛉藝劃發(fā)趣鞍戰(zhàn)謀力吐權 節(jié)才沒底毎事冰冰過壘渤曬全窩福殊域舷外Jake Wharton 奔 Jff 笊 fif 的 Rx !訂 1 苻:. I - :.:OHFTWOTHIWrvdeclare-styleable name=PagerSlidingTabStripvattr name=pstsIndicatorColor format=color /vattr name
4、=pstsUnderlineColor format=color /vattr name=pstsDividerColor format=color /vattr name=pstslndicatorHeight format=dimension /v!-底部區(qū)域的咼度-vattr name=pstsUnderlineHeight format=dimension /v!-分割線與上下的間距-vattr name=pstsDividerPadding format=dimension /v!-每個 Tab 的左右邊距-vattr name=pstsTabPaddingLeftRight for
5、mat=dimension /v!-選中 tab 的滾動偏移量,個人基本沒有用到過-vattr name=pstsScrollOffset format=dimension /v!-每個 Tab 的背景圖,StateListDrawable-vattr name=pstsTabBackground format=reference /v!-是否根據(jù) tab 均為位置,true 的時候均分,默認為 false,一般都是使用默認值-vattr name=pstsShouldExpand format=boolean /v!-標題文本是否大寫,默認為true-vattr name=pstsTextA
6、IICaps format=boolean /v/declare-styleablev/resources看下犬致的布局和雇性對號入座tablMckgroundetividec diidarpiaddingIndicatorunderhneW! )puj63gquj)puno6v電e門 3 乂比*戶1人丄*戶”丄0 ooM popoixaipe .oPJOA彳比1心譏Pl嚴片QoP5M:ftU!) )*Op丄那Q.o址:Om$A丄見oM*彳料陽/廠丄9,oL 如啊ooqDfV Qo吟ooq彷dnvix* 9ouerooq Jputd*3ppo4$6QoPJOAfuzjoocUpuMqppOii
7、W1ooPJOA gM勺Q|6SA$ 4.o比:06ujppjnOWJOtOJdpyMQ*2pU26 0oPJOA (lUpAHXqpOpnXhpunps 9.oPJOA JMIpOpJppunRS Qo比:SH如屮 O 沙松產(chǎn)6PJOA :(u6屮oiupug 0eWJ X)Poepujp6QoPOA.(vjj3jnosa40|0j04ripund5QoPJOA:Z!po( (o Aogpu w C類中的駅U眥和方法,基本上和上面的自定義屬性可以對上粵,不僅可以在布局文伸中建義,還可以通過代 咼謹廳設豈.ATT1RS? WQ =MWFtO (= drffluhTiibLAyDuiiflFAn
8、nii:UtyMrtPiFinmi tKpadncMT|&LyQut*rdm LnxftP*nn p*glkfc?rMrr: P*gifUftHr = ngF tfbCwnt: iirat cwrrtrtcifibof ini 0OM rntPq $ rEuxOdlfct flQart=優(yōu) 地酣匕沁Piirt寸鬲旅用*:咤Pint pnditiffiCMColar: iriri = DKFF666666 “JM*沁比出(甘!in# = DvIAOOOOQO drvidkrCalan i-rrt = Chi/MXKMOO呻腫#:bo權床I訂=卡*育KeMtAJlCdprsc boalri
9、w = Inuc- wrolOftwf iintE52 tfKlicdrto-Hghfc irtit = B wiHcfen*H*gHi in寒2 dnAderPAddfingz inrt = 12 ubPAdiild int 2*4 dndWtcfth:H = 1ub7?nSize: 12UtbTcxfColqcHTE = thfFF-&66666 HbTyp屛粒也Typ呂*更a hull LabTpcBc-Slylfi:int = Tpefafe.iBDLD LSCFO1DC: i rt = 0類中使用到的變量,大部分都是和自定義屬性掛鉤的,主要關注幾個吏坦JVTTRS弓I用Aiu
10、Zi孫野的兩亍麗性,文本字體大小和字體顏色pageLi stener內(nèi)部使用SJOnf agerChangeLi stener,通過set% ewFager實現(xiàn)和i ewfager的聯(lián)動delegat eFageLi stener暴壽給開炭者的接口, 類本身使用到了兩個OnPageChgeLiztener,一個用來實現(xiàn)自己的邏 輯而遠平則是留緒開水者實現(xiàn)自己需要針對“我連鈦的頁面孌化的倉輯t&bsCont&in 電 f內(nèi)部客器,用尸所見文本指示盞和國標指示爲的父書點所以,如果需要軒對文本指示器或 者是圖標指示器做卄么操作,邇過這催找孩子節(jié)點即可bttA曲呂甘aM&tiT
11、 ftEceinTAbPrwiderv gelPdgrkcmA.4-Kld(nll!r:irrtV 0 PnffUhervr1bi cmP旳eScrcIkdlj憾 怡貞fn|J:C*d IO丁空產(chǎn)kangetntenr-占(HiP些ef口void “PgerL-沖亡Lili訥 hO b coPjgeSlwlediirvtA:wid FO-VAq t*ZTJng-Li ilB-rM* i督金Sartdtate6 由SrvcFdStatcf PdrcdflblJ0 n S*rtdlSlatrR irt色CftEATORi CvWtovcSflwdSllte* Mw Crvutor3 4 P吋日常i
12、苗ngTflb5?np(CMr*l* PsgetSdgTMlnpCMeEt. Att/rbyteSetiO P*9frTSdrngTd bStripi:Coniekl AshibueSet iM.0 HtelVwwa g e riView?qer); oidO & 5rrlOn?.fg?i!OiaftgictLlTrfKTj On*grChiric Listener):v4d a ncFtrffltiSrtC KfingsdO7& h iddTe*rtT*b(iM. String):怕0O b ddkcmTflbl ifil.e 依voidQaddTb(nn, Vwwh rti
13、d updatevodIconTabProvider類中比較關鍵的一些內(nèi)容,接口IconTabProvider, ViewPager 對應的 Adapter 實現(xiàn)該方法并返回每個ViewPager 對應的圖標即可實現(xiàn)圖標指示器。PageListener private class PageListener implements OnPageChangeListener Overridepublic void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) /存儲當前位置信息currentP
14、osition = position;currentPositionOffset = positionOffset;/滑動到子視圖scrollToChild(position, (int) (positionOffset * tabsContainer.getChildAt(position).getWidth();invalidate。;/ 觸發(fā)重繪/用戶自定義的 OnPagerChangeListener 事件之 onPagerScrolledif (delegatePageListener != ull) delegatePageListener.onPageScrolled(posit
15、ion,positionOffset, positionOffsetPixels);Overridepublic void onPageScrollStateChanged(int state) /已經(jīng)滑動完成,offset 歸 0if (state = ViewPager.SCROLL_STATE_IDLE) scrollToChild(pager.getCurrentItem(), 0);/用戶自定義的 OnPagerChangeListener 事件之 onPageScrollStateChanged if(delegatePageListener != null) delegatePa
16、geListener.onPageScrollStateChanged(state);Overridepublic void onPageSelected(int position) 這里類內(nèi)部沒有做什么處理,只處理用戶自定義的OnPagerSelected 方法if (delegatePageListener != null) delegatePageListener.onPageSelected(position);/*滑動指定子視圖*/private void scrollToChild(int position, int offset) if (tabCount = 0) return
17、;int newScrollX = tabsContainer.getChildAt(position).getLeft() + offset;if (position 0 | offset 0) newScrollX -= scrollOffset;if (newScrollX != lastScrollX) lastScrollX = newScrollX;scrollTo(newScrollX, 0);PagerSlidingTabStrip 構造方法 構造方法的內(nèi)容不多,基本上全是基本屬性的獲取,自定義View 中常用的TypedArray ,記得回收recycle。,這里關注一下Ty
18、pedValue.applyDimension 方法的使用,全部轉(zhuǎn)換成 px。public PagerSlidingTabStrip(Context context, AttributeSet attrs, int defStyle) super(context, attrs, defStyle);setFillViewport(true);setWillNotDraw(false);tabsContainer = new LinearLayout(context);tabsContainer.setOrientation(LinearLayout.HORIZONTAL);tabsContai
19、ner.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MA TCH_PARENT);addView(tabsContainer);DisplayMetrics dm = getResources().getDisplayMetrics();scrollOffset = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, scrollOffset,dividerPadding, dm);tabPadding = (int) Typ
20、edValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, tabPadding,dm);dividerWidth = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dividerWidth,dm);tabTextSize = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, tabTextSize,dm);/ get system attrs (android:textSize and android:t
21、extColor)TypedArray a = context.obtainStyledAttributes(attrs, A TTRS); tabTextSize =a.getDimensionPixelSize(0, tabTextSize);tabTextColor = a.getColor(1, tabTextColor);a.recycle();/ get custom attrsa = context.obtainStyledAttributes(attrs, R.styleable.PagerSlidingTabStrip);indicatorColor = a.getColor
22、(R.styleable.PagerSlidingTabStrip_pstsIndicatorColor, indicatorColor);underlineColor = a.getColor(R.styleable.PagerSlidingTabStrip_pstsUnderlineColor,dm);indicatorHeight = (int)indicatorHeight, dm);underlineHeight = (int)underlineHeight, dm);dividerPadding = (int)TypedValue.applyDimension(TypedValue
23、.COMPLEX_UNIT_DIP,TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,underlineColor);dividerColor = a.getColor(R.styleable.PagerSlidingTabStrip_pstsDividerColor, dividerColor);indicatorHeight = a.getDimensionPixelSize(R.styleable.PagerSlidingT
24、abStrip_pstsIndicatorHeight, indicatorHeight);underlineHeight = a.getDimensionPixelSize(R.styleable.PagerSlidingTabStrip_pstsUnderlineHeight,underlineHeight);dividerPadding = a.getDimensionPixelSize(R.styleable.PagerSlidingTabStrip_pstsDividerPadding,dividerPadding);tabPadding = a.getDimensionPixelS
25、ize(R.styleable.PagerSlidingTabStrip_pstsTabPaddingLeftRight,tabPadding);tabBackgroundResId = a.getResourceId(R.styleable.PagerSlidingTabStrip_pstsTabBackground,tabBackgroundResId);shouldExpand = a.getBoolean(R.styleable.PagerSlidingTabStrip_pstsShouldExpand, shouldExpand);scrollOffset = a.getDimens
26、ionPixelSize(R.styleable.PagerSlidingTabStrip_pstsScrollOffset,scrollOffset);textAllCaps = a.getBoolean(R.styleable.PagerSlidingTabStrip_pstsTextAllCaps, textAllCaps);a.recycle();/* 初始化矩形 Paint */rectPaint = new Paint();rectPaint.setAntiAlias(true); rectPaint.setStyle(Style.FILL);/* 初始化分割線 Paint */
27、dividerPaint = new Paint(); dividerPaint.setAntiAlias(true);dividerPaint.setStrokeWidth(dividerWidth);/* 是否延伸,默認 WRAP_CONTENT, 這種比較合理 */ defaultTabLayoutParams = newLinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MA TCH_PARENT);expandedTabLayoutParams = new LinearLayout.LayoutParam
28、s(0, LayoutParams.MA TCH_PARENT,1.0f);if (locale = null) locale = getResources().getConfiguration().locale;onDrawOverrideprotected void onDraw(Canvas canvas) super.onDraw(canvas);if (isInEditMode() | tabCount = 0) return;final int height = getHeight();/ 設置 Indicator 顏色 rectPaint.setColor(indicatorCo
29、lor);/ 獲取當前選中 TabView currentTab = tabsContainer.getChildAt(currentPosition);/獲取 Left,Right 值float lineLeft = currentTab.getLeft();float lineRight = currentTab.getRight();/ if there is an offset, start interpolating left and right coordinates between current and next tabif (currentPositionOffset 0f
30、& currentPosition tabCount - 1) /結(jié)合下一個 Tab 獲取當前要繪制的 indicator 的位置 , 這里的 currentPositionOffset 比較關 鍵,可以看到這個值是與 ViewPager 相關的,在 onPagerScrolled 方法中,這個值在不斷的更新View nextTab = tabsContainer.getChildAt(currentPosition + 1);final float nextTabLeft = nextTab.getLeft();final float nextTabRight = nextTab.g
31、etRight();lineLeft = (currentPositionOffset * nextTabLeft + (1f - currentPositionOffset) * lineLeft); lineRight =(currentPositionOffset * nextTabRight + (1f - currentPositionOffset) * lineRight);/ 繪制 Indicator canvas.drawRect(lineLeft, height - indicatorHeight, lineRight, height, rectPaint);/ 繪制 Und
32、erLine rectPaint.setColor(underlineColor);canvas.drawRect(0, height - underlineHeight, tabsContainer.getWidth(), height, rectPaint);/ 繪制分割線 dividerPaint.setColor(dividerColor);for (int i = 0; i tabCount - 1; i+) View tab = tabsContainer.getChildAt(i);canvas.drawLine(tab.getRight(), dividerPadding, t
33、ab.getRight(), height - dividerPadding,dividerPaint);setViewPager, setOnPageChangeListener 一個用來與 ViewPager 聯(lián)動,一個用來處理自定義的OnPagerListener 邏輯public void setViewPager(ViewPager pager) this.pager = ager;if (pager.getAdapter() = null) throw new lllegalStateException(ViewPager does not have adapter instanc
34、e.);pager.setOnPageChangeListener(pageListener); notifyDataSetChanged(); public void setOnPageChangeListener(OnPageChangeListener listener) this.delegatePageListener = listener;3. PagerS 1 i dingTabStrip環(huán)口關鍵點在于實現(xiàn)自己的OnPagerListenerOverrideprotected void onCreate(Bundle savedInstanceState) super.onCre
35、ate(savedInstanceState);setContentView(R.layout.activity_main);文本指示器選中后文本大小和酸色變化IndicaforDmoButterKnife.bind(this);MainPagerAdapter mainPagerAdapter = new MainPagerAdapter(getSupportFragmentManager();vpContent.setAdapter(mainPagerAdapter);pstsIndicator.setViewPager(vpContent); vpContent.addOnPageChangeListener(newViewPager.OnPageChangeListener() Overridepublic void onPageScrolled(int position, float positionOffset, int positionOffsetPixel
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 鄉(xiāng)村振興可行性研究報告(5篇)
- 結(jié)算協(xié)議書范本(10篇)
- 關于禮儀廣播稿(18篇)
- 體育營銷與社會責任-洞察分析
- 《客服新人培訓》課件
- 網(wǎng)絡擁塞緩解策略-洞察分析
- 水泥生產(chǎn)線能耗監(jiān)測-洞察分析
- 微生物酶催化合成研究-洞察分析
- 同學聚會策劃方案范文
- 無人駕駛汽車在物流配送中的應用-洞察分析
- GB/T 45076-2024再生資源交易平臺建設規(guī)范
- 四川省巴中市2021-2022學年九年級上學期期末語文試題(解析版)
- 冬季防凍培訓課件
- 職業(yè)衛(wèi)生監(jiān)督檢查表
- 幼兒系列故事繪本課件貝貝熊系列-受人冷落-
- 消防水池 (有限空間)作業(yè)安全告知牌及警示標志
- 2022年中醫(yī)藥人才培養(yǎng)工作總結(jié)
- 精美小升初簡歷小學生自我介紹歐式word模板[可編輯]
- 采礦學課程設計陳四樓煤礦1.8mta新井設計(全套圖紙)
- 201X最新離婚協(xié)議書(簡潔版)
- 標簽打印流程
評論
0/150
提交評論