Android 强行进阶:自定义 TabLayout,看似复杂的神器效果
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 /
/ 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();}
属性说明
文章到这里就已经说完啦,如果你对实现思路有更好的建议,欢迎留言,指正。
源码地址:
总结
【Android 详细知识点思维脑图(技能树)】
其实 Android 开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。
虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。
这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司 19 年的面试题。把技术点整理成了视频和 PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。
由于篇幅有限,这里以图片的形式给大家展示一小部分。
评论