下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、拧恥和演技井飢拒硼斑剜- jgU不必*4砖岁仍独守空房20it内地黑房破 m 亿比去年WtUiiOO万简单使用恥幻的下 Tt 皈齐正住畫母更魏也幵炭当中=啟管 在爺陋車中,很多慨柞苻丼未友生窪代.可现 隶时 It(absHvabr creatiDnh订冋理(su bEfiptiofimanagement)(hackpressure)林&行 了站氏沏曜堆改迸.在辛决 GOTO Copan 贴鈔A加圧的融演 中,虫賑将焦诃嵌虫裤 2 迟行了月神改进,戏段电些 改逍甘闻的犀區淡将学习*1 诵如何将驚三方躍抑应用 同时违移到取上沖 2 耳申,以段谨帕何在訴介 R*Jp 辟 版客之间亘用环添加库
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/关联 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瑕阴上蛉艺划发趣鞍战謀力吐權 节才没底毎事冰冰过垒渤晒全窝福殊域舷外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!-底部区域的咼度-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!-是否根据 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 沙松产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=优 地酣匕沁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内部使用SJOnf agerChangeLi stener,通过set% ewFager实现和i ewfager的联动delegat eFageLi stener暴壽给开炭者的接口, 类本身使用到了两个OnPageChgeLiztener,一个用来实现自己的逻 辑而遠平则是留绪开水者实现自己需要针对“我連钛的页面娈化的倉辑t&bsCont&in 电 f内部客器,用尸所见文本指示盏和国标指示爲的父书点所以,如果需要軒对文本指示器或 者是图标指示器做卄么操作,邇过这催找孩子节点即可bttA曲吕甘aM&tiT
11、 ftEceinTAbPrwiderv gelPdgrkcmA.4-Kld(nll!r:irrtV 0 PnffUhervr1bi cmP旳eScrcIkdlj憾 怡貞fn|J:C*d IO丁空产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类中比较关键的一些内容,接口IconTabProvider, ViewPager 对应的 Adapter 实现该方法并返回每个ViewPager 对应的图标即可实现图标指示器。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。;/ 触发重绘/用户自定义的 OnPagerChangeListener 事件之 onPagerScrolledif (delegatePageListener != ull) delegatePageListener.onPageScrolled(posit
15、ion,positionOffset, positionOffsetPixels);Overridepublic void onPageScrollStateChanged(int state) /已经滑动完成,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) 这里类内部没有做什么处理,只处理用户自定义的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 构造方法 构造方法的内容不多,基本上全是基本属性的获取,自定义View 中常用的TypedArray ,记得回收recycle。,这里关注一下Ty
18、pedValue.applyDimension 方法的使用,全部转换成 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) /结合下一个 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 联动,一个用来处理自定义的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环口关键点在于实现自己的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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年广东省建筑装饰集团公司招聘备考题库及参考答案详解一套
- 2026年成都备考题库工程大学、成都职业技术学院公开招聘38人及答案详解1套
- 2026年东至县机关事务服务中心招聘司勤人员备考题库附答案详解
- 2026年天津市津南区卫生健康系统面向社会公开招聘事业单位工作人员备考题库及答案详解参考
- 2026年厦门市杏南中学非在编教师招聘备考题库带答案详解
- 2026年上海市实验学校西校教师招聘备考题库及一套参考答案详解
- 2026年北京华科软科技有限公司招聘备考题库参考答案详解
- 2026年上海市普陀区新普陀小学招聘备考题库及答案详解1套
- 2026年关于三明市殡葬服务中心公开招聘劳务派遣人员的备考题库及答案详解一套
- 2026年学年第一学期厦门市翔安区舫山第二小学公开招聘顶岗非在编合同教师备考题库及完整答案详解一套
- 2026届江苏省常州市高一上数学期末联考模拟试题含解析
- 2026年及未来5年市场数据中国水质监测系统市场全面调研及行业投资潜力预测报告
- 艺考机构协议书
- 2025年12月27日四川省公安厅遴选面试真题及解析
- 2026年农业科技领域人才选拔与专业技能考核要点解析
- 2025-2030中国海洋工程装备制造业市场供需关系研究及投资策略规划分析报告
- 《生态环境重大事故隐患判定标准》解析
- 乳腺癌术后患者调查表
- 氟化氢生产企业安全检查表
- 打造阜南路餐饮美食街实施方案
- 流耘EXCEL账务处理系统
评论
0/150
提交评论