写点什么

Android 强行进阶:自定义 TabLayout,看似复杂的神器效果

用户头像
Android架构
关注
发布于: 18 分钟前

paint.setColor(selectColor);canvas.drawPath(pathRight, paint);


tabtext 的绘制(关键代码):


for (int i = 0; i < tabTextList.size(); i++) {String strTabText = tabTextList.get(i);Rect rectText = new Rect();textPaint.getTextBounds(strTabText, 0, strTabText.length(), rectText);int strWidth = rectText.width();int strHeight = rectText.height();if (i == 0) {canvas.drawText(strTabText, (textWidth + arcWidth / 2) / 2 - strWidth / 2, viewHeight / 2 + strHeight / 2, textPaint);} else if (i == tabTextList.size() - 1) {canvas.drawText(strTabText, viewWidth - (textWidth + arcWidth /


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


  1. / 2 - strWidth / 2, viewHeight / 2 + strHeight / 2, textPaint);


} else {canvas.drawText(strTabText, textWidth * i + arcWidth * (i - 1) + (textWidth + 2 * arcWidth) / 2 - strWidth / 2, viewHeight / 2 + strHeight / 2, textPaint);}


}


tab 点击处理(关键代码):


@Overridepublic boolean onTouchEvent(MotionEvent event) {boolean isHandleClick = false;//是否处理点击事件


switch (event.getAction()) {case MotionEvent.ACTION_DOWN:float x = event.getX();float y = event.getY();System.out.println("YPKTabLayoutView.onTouchEvent x=" + x + " y=" + y);for (int i = 0; i < tabNumber; i++) {if (x <= ((i + 1) * textWidth + i * arcWidth + arcWidth / 2)) {//点击的第一个按钮 tabPosition = i;


if (onTabClickListener != null) {onTabClickListener.tabSelectedListener(tabPosition);}


invalidate();isHandleClick = true;


break;}}


return isHandleClick;


case MotionEvent.ACTION_MOVE:break;case MotionEvent.ACTION_UP:break;}return super.onTouchEvent(event);}


步骤说明:


我们在 onTouchEvent 方法中, 首先获取到点击控件后 x,y 坐标,然后 for 循环判断 x 的坐标是在哪个 tab 项的范围内,最后在哪个范围内,我们就认为点击了那个 tab 项,回调对应的 tabPosition 就可以了。

远程依赖使用

一:添加依赖


Add it in your root build.gradle at the end of repositories:


allprojects {repositories {...maven { url 'https://jitpack.io' }}}


Add the dependency


dependencies {implementation 'com.github.dacaoyuan:YPKTabDemo:1.0.2'}


二:在 xml 布局中添加


<com.ypk.library.view.YPKTabLayoutViewandroid:id="@+id/mYPKTabLayoutView"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="10dp"app:view_bg_corners="0"app:arcControlX="30" />


三:代码中


val tabTextList: MutableList<String> = ArrayList<String>()


tabTextList.add("推荐学习");tabTextList.add("企业学院");tabTextList.add("我的关注");mYPKTabLayoutView.setTabTextList(tabTextList);


mYPKTabLayoutView.addTabSelectedListener { tabPosition ->val makeText =Toast.makeText(this@MainActivity,"点击了第" + tabPosition + "项",Toast.LENGTH_SHORT)makeText.setGravity(Gravity.CENTER, 0, 0);makeText.show();}


属性说明



文章到这里就已经说完啦,如果你对实现思路有更好的建议,欢迎留言,指正。


源码地址:


https://github.com/dacaoyuan/YPKTabDemo

总结

【Android 详细知识点思维脑图(技能树)】



其实 Android 开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。


虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。


这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司 19 年的面试题。把技术点整理成了视频和 PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。


由于篇幅有限,这里以图片的形式给大家展示一小部分。

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
Android强行进阶:自定义TabLayout,看似复杂的神器效果