代码实现共2个类,TabView和Tab
TabView的绘制方法.
01 | @Override |
02 | protected void onDraw(Canvas canvas) { |
03 | super .onDraw(canvas); |
04 | canvas.translate(tabViewStart_x, 0 ); |
05 | if (tabs == null ) |
06 | return ; |
07 | if (!initTabRegion) { |
08 | // 给每个Tab分配区域. |
09 | initTabRegion(); |
10 | // 设置第一个Tab选中. |
11 | setTabFocus(tabs.get( 0 )); |
12 | } |
13 | for (Tab tab : tabs) { |
14 | if (currentTab != tab || !scrollTab) { |
15 | // 调用每个Tab的draw方法. |
16 | tab.draw(canvas); |
17 | } |
18 | } |
19 | if (currentTab != null && scrollTab) { |
20 | // 移动状态时调用. |
21 | currentTab.drawMovement(canvas, currentTabStart_x + currentTabMove_x); |
22 | } |
23 | canvas.translate(-tabViewStart_x, 0 ); |
24 | tempRegion.set( 0 , 55 , currentTabStart_x + getWidth(), 60 ); |
25 | canvas.drawBitmap(TabUtil.tab_band, null , tempRegion, null ); |
26 | } |
TabView的事件
01 | @Override |
02 | public boolean onTouchEvent(MotionEvent event) { |
03 | event.setLocation(event.getX() - tabViewStart_x, event.getY()); |
04 | switch (event.getAction()) { |
05 | case MotionEvent.ACTION_DOWN: |
06 | // 获取选中Tab. |
07 | currentTab = getCurrentTab(event, false ); |
08 | if (currentTab != null ) { |
09 | longPress = true ; |
10 | // 长按事件. |
11 | onLongPress(); |
12 | currentTabStart_x = currentTab.getRegion().left; |
13 | currentTabMove_x = 0 ; |
14 | setTabFocus(currentTab); |
15 | } |
16 | x = ( int ) event.getX(); |
17 | y = ( int ) event.getY(); |
18 | break ; |
19 | case MotionEvent.ACTION_MOVE: |
20 | if (Math.abs(event.getX() - x) > 10 || Math.abs(event.getY() - y) > 10 ) { |
21 | longPress = false ; |
22 | } |
23 | if (currentTab == null ) { |
24 | break ; |
25 | } |
26 | if (scrollTab) { |
27 | Tab tab = getCurrentTab(event, true ); |
28 | // 长按Tab移动,实现Tab之间的替换. |
29 | if (tab != null && currentTab != tab) { |
30 | int tabID = tabs.indexOf(tab); |
31 | int currentTabID = tabs.indexOf(currentTab); |
32 | tabs.set(tabID, currentTab); |
33 | tabs.set(currentTabID, tab); |
34 | initTabRegion(); |
35 | } |
36 | } else { |
37 | // 整个View的拖拽. |
38 | tabViewStart_x += ( int ) event.getX() - x; |
39 | } |
40 | currentTabMove_x = ( int ) event.getX() - x; |
41 | break ; |
42 | case MotionEvent.ACTION_UP: |
43 | longPress = false ; |
44 | scrollTab = false ; |
45 | if (task != null ) { |
46 | task.cancel(); |
47 | } |
48 | // 拖拽松开时开启一个Timer,实现自定义动画效果. |
49 | task = new TimerTask() { |
50 | @Override |
51 | public void run() { |
52 | animateHandler.sendEmptyMessage( 1 ); |
53 | } |
54 | }; |
55 | if (tabViewStart_x > 0 ) { |
56 | start = 0 ; |
57 | timer.schedule(task, 0 , 20 ); |
58 | } |
59 | break ; |
60 | } |
61 | event.setLocation(event.getX() + tabViewStart_x, event.getY()); |
62 | invalidate(); |
63 | return true ; |
64 | } |
Handler接受Timer发送的消息.
01 | private Handler animateHandler = new Handler() { |
02 | public void dispatchMessage(Android.os.Message msg) { |
03 | // 自定义动画效果. |
04 | startAnimation( 600 ); |
05 | if (tabViewStart_x <= 0 && task != null ) { |
06 | task.cancel(); |
07 | tabViewStart_x = 0 ; |
08 | } |
09 | invalidate(); |
10 | }; |
11 | }; |
Tab的绘制方法.
01 | public void draw(Canvas canvas) { |
02 | canvas.setDrawFilter(pdf); |
03 | if (sheetTabAdd) { |
04 | this .tab_left = TabUtil.tab_off_left; |
05 | this .tab_mid = TabUtil.tab_off_mid; |
06 | this .tab_right = TabUtil.tab_off_right; |
07 | drawBitmap(canvas, region, null ); |
08 | } else { |
09 | if (thisFocus) { |
10 | this .tab_left = TabUtil.tab_on_left; |
11 | this .tab_mid = TabUtil.tab_on_mid; |
12 | this .tab_right = TabUtil.tab_on_right; |
13 | } else { |
14 | this .tab_left = TabUtil.tab_off_left; |
15 | this .tab_mid = TabUtil.tab_off_mid; |
16 | this .tab_right = TabUtil.tab_off_right; |
17 | } |
18 | // 绘制图片. |
19 | drawBitmap(canvas, region, null ); |
20 | // 绘制文字. |
21 | canvas.drawText(title, region.left + 45 , region.bottom - 12 , textPaint); |
22 | } |
23 | } |
Tab移动时的绘制方法.
01 | public void drawMovement(Canvas canvas, int currentMove_x) { |
02 | canvas.setDrawFilter(pdf); |
03 | if (paint == null ) { |
04 | paint = new Paint(); |
05 | paint.setAlpha( 200 ); |
06 | } |
07 | if (moveRegion == null ) { |
08 | moveRegion = new Rect(currentMove_x, region.top, currentMove_x + getTabWidth(), region.bottom); |
09 | } else { |
10 | moveRegion.left = currentMove_x; |
11 | moveRegion.right = currentMove_x + getTabWidth(); |
12 | } |
13 | drawBitmap(canvas, moveRegion, paint); |
14 | canvas.drawText(title, currentMove_x + 45 , region.bottom - 12 , textPaint); |
15 | } |