自定义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 }


    • 1
      点赞
    • 0
      收藏
      觉得还不错? 一键收藏
    • 0
      评论
    TabHost 是 Android 应用程序中常用的选项卡控件,用于在多个选项卡之间切换。以下是 Android Studio 中使用 TabHost 控件的步骤: 1. 在布局文件中添加 TabHost 控件 ``` <TabHost android:id="@+id/tab_host" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TabWidget android:id="@android:id/tabs" android:layout_width="match_parent" android:layout_height="wrap_content" /> <FrameLayout android:id="@android:id/tabcontent" android:layout_width="match_parent" android:layout_height="match_parent"> <!-- 添加选项卡内容布局 --> <LinearLayout android:id="@+id/tab1_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Tab 1" /> </LinearLayout> <LinearLayout android:id="@+id/tab2_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Tab 2" /> </LinearLayout> </FrameLayout> </LinearLayout> </TabHost> ``` 2. 在 Java 代码中获取 TabHost 控件并设置选项卡 ```java TabHost tabHost = findViewById(R.id.tab_host); tabHost.setup(); // 添加选项卡 TabHost.TabSpec tab1 = tabHost.newTabSpec("Tab1"); tab1.setIndicator("Tab 1"); tab1.setContent(R.id.tab1_layout); tabHost.addTab(tab1); TabHost.TabSpec tab2 = tabHost.newTabSpec("Tab2"); tab2.setIndicator("Tab 2"); tab2.setContent(R.id.tab2_layout); tabHost.addTab(tab2); ``` 在以上代码中,我们首先获取 TabHost 控件,并通过 `setup()` 方法初始化。然后,我们使用 `newTabSpec()` 方法创建选项卡,并设置选项卡的标签和内容布局。最后,我们使用 `addTab()` 方法将选项卡添加到 TabHost 控件中。 以上就是使用 TabHost 控件的基本步骤。你可以根据自己的需要自定义选项卡的样式和内容。

    “相关推荐”对你有帮助么?

    • 非常没帮助
    • 没帮助
    • 一般
    • 有帮助
    • 非常有帮助
    提交
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值