自定义TabHost扩展控件TabView

代码实现共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(055, 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, 020); 
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 }


    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值