创新源于模仿之一:TabActivity的美化

简介:
 

今天开始一个新专题:创新源于模仿。

第一篇从TabActivity着手,一直以为Android中的TabActivity只能放在上面,只能如此丑陋,直到有一天看到“米聊”。



咋一看,软件下面的那个菜单栏,觉得像是用LinearLayout+Button来实现的,但事实上,它却是一个Tab!
怎么看出来的?我就不多说了,你懂的。

下面我们来抽丝剥茧,一步步分析它的实现过程。

1.TabActivity的布局


  1. <TabHost xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@android:id/tabhost"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
      >
     <LinearLayout
      android:orientation="vertical"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent">
      
             
            <FrameLayout
             android:gravity="center"
             android:id="@android:id/tabcontent"
             android:layout_width="fill_parent"
             android:layout_height="wrap_content"
             android:layout_weight="1.0" >
             
             <LinearLayout android:id="@+id/first"
                    android:orientation="vertical"
                    android:background="#ffffff"
                    android:layout_width="fill_parent"
                    android:layout_height="fill_parent"
                   >
                    <TextView android:layout_width="fill_parent"
                        android:layout_height="fill_parent"
                        android:text="first tab" />
                </LinearLayout>
                <LinearLayout android:id="@+id/second"
                    android:orientation="vertical"
                    android:background="#ffffff"
                    android:layout_width="fill_parent"
                    android:layout_height="fill_parent"
                    >
                    <TextView android:layout_width="fill_parent"
                        android:layout_height="fill_parent"
                        android:text="second tab" />
                </LinearLayout>
             
            </FrameLayout>
           
            <TabWidget
             android:id="@android:id/tabs"
             android:background="@drawable/tab_bottom_bg"
             android:padding="3.0dip"
             android:layout_width="fill_parent"
             android:layout_height="wrap_content"
             android:layout_weight="0.0" />
           
        </LinearLayout>   
    </TabHost>  

 

 

我们看到,要自定义一个位于屏幕下方的TAB标签,首先我们不能使用缺省的TabActivity实现了,啥事都要自己亲力亲为。
很好理解,把tabs放在tabcontent下面就可以了。其它不多说了。


2.MainActivity的实现代码


先看看缺省的实现代码,不复杂,省略一些无关的东西:

 

private void setIndicator(int icon, int title, int view) { 
        String str = getResources().getString(title); 
         
        TabHost.TabSpec localTabSpec=tabhost.newTabSpec(str).setIndicator(str,getResources().getDrawable(icon)).setContent(view); 
        tabhost.addTab(localTabSpec); 
    } 
private void setIndicator(int icon, int title, int view) {
     String str = getResources().getString(title);
     
     TabHost.TabSpec localTabSpec=tabhost.newTabSpec(str).setIndicator(str,getResources().getDrawable(icon)).setContent(view);
     tabhost.addTab(localTabSpec);
    }

 

可以测试一下,效果出来了吧,虽然有点丑,但它真的在屏幕下方了。

 

3.美化TAB标签

 

现在我们来定制这个TAB的标签。先看代码:

    private void setIndicator(int icon, int title, int view) {
     
     View localView = LayoutInflater.from(this.tabhost.getContext()).inflate(R.layout.main_activity_tab, null);
     ((ImageView)localView.findViewById(R.id.main_activity_tab_image)).setBackgroundResource(icon);
     ((TextView)localView.findViewById(R.id.main_activity_tab_text)).setText(title);
     
     String str = getResources().getString(title);
     
     TabHost.TabSpec localTabSpec = tabhost.newTabSpec(str).setIndicator(localView).setContent(view);
     tabhost.addTab(localTabSpec);
     
    }

 

注意到这个main_activity_tab的layout了吧,看看它的内容:

 

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"   
  3.     android:gravity="center"   
  4.     android:orientation="vertical"   
  5.     android:id="@id/tabsLayout"   
  6.     android:background="@drawable/tab_item_bkg"   
  7.     android:padding="3.0dip"   
  8.     android:layout_width="wrap_content"   
  9.     android:layout_height="wrap_content"   
  10.     android:layout_marginTop="3.0dip"   
  11.     android:layout_marginBottom="3.0dip"  
  12.   >  
  13.       
  14.     <FrameLayout   
  15.         android:layout_width="fill_parent"   
  16.         android:layout_height="fill_parent"   
  17.         android:layout_weight="0.6">  
  18.           
  19.         <ImageView   
  20.             android:layout_gravity="center"   
  21.             android:id="@id/main_activity_tab_image"   
  22.             android:layout_width="wrap_content"   
  23.             android:layout_height="wrap_content"   
  24.             android:layout_marginTop="2.0dip"   
  25.             android:scaleType="center" />  
  26.           
  27.     </FrameLayout>  
  28.       
  29.     <TextView   
  30.         android:textSize="12.0dip"   
  31.         android:textColor="@drawable/tab_text_selector"   
  32.         android:id="@id/main_activity_tab_text"   
  33.         android:layout_width="wrap_content"   
  34.         android:layout_height="wrap_content"   
  35.         android:text="Title" />  
  36. </LinearLayout  

 

这个文件定义了每个TAB标签的样式,tab_item_bkg定义每个item的背景(包括focused/selected/pressed),每个item上面的图标和下面的文字都在代码中动态定义即可。其中tab_text_selector则定义文字的颜色。

 

剩下的事情就越发明显了,不用多说了。

相关文章
|
6天前
|
Swift iOS开发 UED
揭秘一款iOS应用中令人惊叹的自定义动画效果,带你领略编程艺术的魅力所在!
【9月更文挑战第5天】本文通过具体案例介绍如何在iOS应用中使用Swift与UIKit实现自定义按钮动画,当用户点击按钮时,按钮将从圆形变为椭圆形并从蓝色渐变到绿色,释放后恢复原状。文中详细展示了代码实现过程及动画平滑过渡的技巧,帮助读者提升应用的视觉体验与特色。
27 11
|
30天前
|
Swift iOS开发 UED
【绝妙创意】颠覆你的视觉体验!揭秘一款iOS应用中令人惊叹的自定义动画效果,带你领略编程艺术的魅力所在!
【8月更文挑战第13天】本文通过一个具体案例,介绍如何使用Swift与UIKit在iOS应用中创建独特的按钮动画效果。当按钮被按下时,其形状从圆形变化为椭圆形,颜色则从蓝色渐变为绿色;释放后,动画反向恢复原状。利用UIView动画方法及弹簧动画效果,实现了平滑自然的过渡。通过调整参数,开发者可以进一步优化动画体验,增强应用的互动性和视觉吸引力。
35 7
|
30天前
|
算法 搜索推荐 开发者
ChatGPT Prompt 的神秘巅峰:LangGPT 框架震撼登场,改变一切!
【8月更文挑战第13天】在数字化时代,ChatGPT 以卓越的语言处理能力成为焦点。通过掌握如 LangGPT 的有效思维框架,可显著提升与其交互的质量。关键在于明确问题、精确指令及详述期望输出。例如,撰写推广文案时具体说明产品特点与风格要求;寻求代码帮助时指定算法与语言。这些实践能最大化挖掘 ChatGPT 的潜力,为工作生活带来创新与便利。
40 2
|
11天前
|
开发者 图形学 前端开发
绝招放送:彻底解锁Unity UI系统奥秘,五大步骤教你如何缔造令人惊叹的沉浸式游戏体验,从Canvas到动画,一步一个脚印走向大师级UI设计
【8月更文挑战第31天】随着游戏开发技术的进步,UI成为提升游戏体验的关键。本文探讨如何利用Unity的UI系统创建美观且功能丰富的界面,包括Canvas、UI元素及Event System的使用,并通过具体示例代码展示按钮点击事件及淡入淡出动画的实现过程,助力开发者打造沉浸式的游戏体验。
28 0
|
20天前
|
前端开发
类抖音logo的光影之旅:CSS动画效果,让标志更具吸引力!
类抖音logo的光影之旅:CSS动画效果,让标志更具吸引力!
|
3月前
|
前端开发 编解码 移动开发
【魅力网页的背后】:CSS基础魔法,从零打造视觉盛宴
【魅力网页的背后】:CSS基础魔法,从零打造视觉盛宴
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
AIGC全面进化,未来的“创意”与“灵感”是否需要被重新定义?
AIGC技术正颠覆内容创作,它通过深度学习等技术自动化生成文本、图像等,改变了生产方式,引发关于“创意”与“灵感”定义的讨论。尽管有人担忧它可能削弱人类独特性,但更多人认为AIGC是创意的延伸而非替代。Adobe国际认证反映了这种变化,提供系统学习路径,衡量专业水准,促进跨领域合作,成为创意人才发展的重要标志。教育应加强跨学科教育,引入AIGC课程,强化实践创新,以培养适应未来需求的创意人才。
|
人工智能 测试技术
「化腐朽为神奇」:Stability AI又出新工具,草图瞬间精致,不同风格随心选
「化腐朽为神奇」:Stability AI又出新工具,草图瞬间精致,不同风格随心选
102 0
|
存储 小程序 前端开发
论“斗图”文化兴起和分享一个表情包小程序代码
论“斗图”文化兴起和分享一个表情包小程序代码
186 0
|
算法 机器人 程序员