Android自定義TabLayout,神奇效果竟是如此簡單
前言

思路分析
草圖如下:

代碼實(shí)現(xiàn)
//最左邊的圖形Path pathLeft = new Path();pathLeft.lineTo(textWidth, 0);pathLeft.cubicTo(textWidth + arcControlX, arcControlY, textWidth + arcWidth - arcControlX, viewHeight - arcControlY, textWidth + arcWidth, viewHeight);pathLeft.lineTo(0, viewHeight);pathLeft.lineTo(0, 0);paint.setColor(selectColor);canvas.drawPath(pathLeft, paint);
首先我們的起始點(diǎn)坐標(biāo)是(0,0),到坐標(biāo)(textWidth, 0) 畫一條直線;
然后三階貝塞爾曲線,2個(gè)控制點(diǎn)的坐標(biāo)1(textWidth + arcControlX,arcControlY),坐標(biāo)2(textWidth + arcWidth - arcControlX,viewHeight - arcControlY),結(jié)束的坐標(biāo)(textWidth + arcWidth,viewHeight);
最后畫直線到坐標(biāo)點(diǎn)(0, viewHeight),再到最終的原點(diǎn)(0, 0)。
//中間的圖形Path pathCenter = new Path();pathCenter.moveTo(tabPosition * textWidth + tabPosition * arcWidth, 0);pathCenter.cubicTo(tabPosition * textWidth + tabPosition * arcWidth - arcControlX, arcControlY, tabPosition * textWidth + tabPosition * arcWidth - arcWidth + arcControlX, viewHeight - arcControlY, tabPosition * textWidth + tabPosition * arcWidth - arcWidth, viewHeight);pathCenter.lineTo(tabPosition * textWidth + tabPosition * arcWidth + textWidth + arcWidth, viewHeight);pathCenter.cubicTo(tabPosition * textWidth + tabPosition * arcWidth + textWidth + arcWidth - arcControlX, viewHeight - arcControlY, tabPosition * textWidth + tabPosition * arcWidth + textWidth + arcControlX, arcControlY, tabPosition * textWidth + tabPosition * arcWidth + textWidth, 0);pathCenter.lineTo(tabPosition * textWidth + tabPosition * arcWidth, 0);paint.setColor(selectColor);canvas.drawPath(pathCenter, paint);
//最右邊的圖形Path pathRight = new Path();pathRight.moveTo(viewWidth, 0);pathRight.lineTo(viewWidth - textWidth, 0);pathRight.cubicTo(viewWidth - textWidth - arcControlX, arcControlY, viewWidth - textWidth - arcWidth + arcControlX, viewHeight - arcControlY, viewWidth - textWidth - arcWidth, viewHeight);pathRight.lineTo(viewWidth, viewHeight);pathRight.lineTo(viewWidth, 0);paint.setColor(selectColor);canvas.drawPath(pathRight, paint);
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) / 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);}}
@Overridepublic boolean onTouchEvent(MotionEvent event) {boolean isHandleClick = false;//是否處理點(diǎn)擊事件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)) {//點(diǎn)擊的第一個(gè)按鈕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);}
遠(yuǎn)程依賴使用
一:添加依賴
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("推薦學(xué)習(xí)");tabTextList.add("企業(yè)學(xué)院");tabTextList.add("我的關(guān)注");mYPKTabLayoutView.setTabTextList(tabTextList);mYPKTabLayoutView.addTabSelectedListener { tabPosition ->val makeText =Toast.makeText(this@MainActivity,"點(diǎn)擊了第" + tabPosition + "項(xiàng)",Toast.LENGTH_SHORT)makeText.setGravity(Gravity.CENTER, 0, 0);makeText.show();}
屬性說明

評論
圖片
表情
