`

android UI进阶之仿iphone的tab效果(二)

 
阅读更多

今天把这个仿iphone效果的tab写完,这个例子参考国外rolle3k共享的代码,感谢rolle3k。

上篇博客我们写了一个Itab类,介绍了背景的绘制和简单的一个图的贴图方法。我们继续来完成Itab这个类,同时把他放到MainAcitvity(继承Activity)这个类内部,这样,整个程序只需一个类就可以了。(上篇博客例子运行需要再建一个Activity的子类来作为lanucher)。废话不多说了,看看代码

  1. publicstaticclassiTabextendsView
  2. {
  3. privatePaintmPaint;//背景画笔
  4. privatePaintmActiveTextPaint;//选中
  5. privatePaintmInactiveTextPaint;//未选中
  6. privateArrayList<TabMember>mTabMembers;//tab成员
  7. privateintmActiveTab;
  8. privateOnTabClickListenermOnTabClickListener=null;
  9. publiciTab(Contextcontext,AttributeSetattrs)//构造器,在里面初始化画笔
  10. {
  11. super(context,attrs);
  12. mTabMembers=newArrayList<MainActivity.iTab.TabMember>();
  13. mPaint=newPaint();
  14. mActiveTextPaint=newPaint();
  15. mInactiveTextPaint=newPaint();
  16. mPaint.setStyle(Paint.Style.FILL);
  17. mPaint.setColor(0xFFFFFF00);
  18. mPaint.setAntiAlias(true);
  19. mActiveTextPaint.setTextAlign(Align.CENTER);
  20. mActiveTextPaint.setTextSize(12);
  21. mActiveTextPaint.setColor(0xFFFFFFFF);
  22. mActiveTextPaint.setAntiAlias(true);
  23. mInactiveTextPaint.setTextAlign(Align.CENTER);
  24. mInactiveTextPaint.setTextSize(12);
  25. mInactiveTextPaint.setColor(0xFF999999);
  26. mInactiveTextPaint.setAntiAlias(true);
  27. mActiveTab=0;
  28. }
  29. @Override
  30. protectedvoidonDraw(Canvascanvas)
  31. {
  32. super.onDraw(canvas);
  33. Rectr=newRect();
  34. this.getDrawingRect(r);
  35. //计算每个标签能使用多少像素
  36. intsingleTabWidth=r.right/(mTabMembers.size()!=0?mTabMembers.size():1);
  37. //绘制背景
  38. canvas.drawColor(0xFF000000);
  39. mPaint.setColor(0xFF434343);
  40. canvas.drawLine(r.left,r.top+1,r.right,r.top+1,mPaint);
  41. intcolor=46;
  42. for(inti=0;i<24;i++)
  43. {
  44. mPaint.setARGB(255,color,color,color);
  45. canvas.drawRect(r.left,r.top+i+1,r.right,r.top+i+2,mPaint);
  46. color--;
  47. }
  48. //绘制每一个tab
  49. for(inti=0;i<mTabMembers.size();i++)
  50. {
  51. TabMembertabMember=mTabMembers.get(i);
  52. Bitmapicon=BitmapFactory.decodeResource(getResources(),tabMember.getIconResourceId());
  53. BitmapiconColored=Bitmap.createBitmap(icon.getWidth(),icon.getHeight(),Bitmap.Config.ARGB_8888);
  54. Paintp=newPaint(Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG);
  55. CanvasiconCanvas=newCanvas();
  56. iconCanvas.setBitmap(iconColored);
  57. if(mActiveTab==i)//为已选中的tab绘制一个白蓝的渐变色,未选中的绘制一个白灰的渐变色
  58. {
  59. p.setShader(newLinearGradient(0,0,icon.getWidth(),icon.getHeight(),
  60. 0xFFFFFFFF,0xFF54C7E1,Shader.TileMode.CLAMP));
  61. }
  62. else{
  63. p.setShader(newLinearGradient(0,0,icon.getWidth(),icon.getHeight(),
  64. 0xFFA2A2A2,0xFF5F5F5F,Shader.TileMode.CLAMP));
  65. }
  66. iconCanvas.drawRect(0,0,icon.getWidth(),icon.getHeight(),p);
  67. for(intx=0;x<icon.getWidth();x++)
  68. {
  69. for(inty=0;y<icon.getHeight();y++)
  70. {
  71. if((icon.getPixel(x,y)&0xFF000000)==0)
  72. {
  73. iconColored.setPixel(x,y,0x00000000);
  74. }
  75. }
  76. }
  77. //计算tab图片的位置
  78. inttabImgX=singleTabWidth*i+(singleTabWidth/2-icon.getWidth()/2);
  79. //绘制tab图片选中的和未选中的
  80. if(mActiveTab==i)
  81. {
  82. mPaint.setARGB(37,255,255,255);
  83. canvas.drawRoundRect(newRectF(r.left+singleTabWidth*i+3,r.top+3,
  84. r.left+singleTabWidth*(i+1)-3,r.bottom-2),5,5,mPaint);
  85. canvas.drawBitmap(iconColored,tabImgX,r.top+5,null);
  86. canvas.drawText(tabMember.getText(),
  87. singleTabWidth*i+(singleTabWidth/2),r.bottom-2,mActiveTextPaint);
  88. }else
  89. {
  90. canvas.drawBitmap(iconColored,tabImgX,r.top+5,null);
  91. canvas.drawText(tabMember.getText(),
  92. singleTabWidth*i+(singleTabWidth/2),r.bottom-2,mInactiveTextPaint);
  93. }
  94. }
  95. }
  96. /*
  97. *触摸事件
  98. */
  99. @Override
  100. publicbooleanonTouchEvent(MotionEventmotionEvent)
  101. {
  102. Rectr=newRect();
  103. this.getDrawingRect(r);
  104. floatsingleTabWidth=r.right/(mTabMembers.size()!=0?mTabMembers.size():1);
  105. intpressedTab=(int)((motionEvent.getX()/singleTabWidth)-(motionEvent.getX()/singleTabWidth)%1);
  106. mActiveTab=pressedTab;
  107. if(this.mOnTabClickListener!=null)
  108. {
  109. this.mOnTabClickListener.onTabClick(mTabMembers.get(pressedTab).getId());
  110. }
  111. this.invalidate();
  112. returnsuper.onTouchEvent(motionEvent);
  113. }
  114. voidaddTabMember(TabMembertabMember)
  115. {
  116. mTabMembers.add(tabMember);
  117. }
  118. voidsetOnTabClickListener(OnTabClickListeneronTabClickListener)
  119. {
  120. mOnTabClickListener=onTabClickListener;
  121. }
  122. publicstaticclassTabMember//处理tab成员
  123. {
  124. protectedintmId;
  125. protectedStringmText;
  126. protectedintmIconResourceId;
  127. TabMember(intId,StringText,inticonResourceId)
  128. {
  129. mId=Id;
  130. mIconResourceId=iconResourceId;
  131. mText=Text;
  132. }
  133. publicintgetId()
  134. {
  135. returnmId;
  136. }
  137. publicStringgetText()
  138. {
  139. returnmText;
  140. }
  141. publicintgetIconResourceId()
  142. {
  143. returnmIconResourceId;
  144. }
  145. publicvoidsetText(StringText)
  146. {
  147. mText=Text;
  148. }
  149. publicvoidsetIconResourceId(inticonResourceId)
  150. {
  151. mIconResourceId=iconResourceId;
  152. }
  153. }
  154. publicstaticinterfaceOnTabClickListener
  155. {
  156. publicabstractvoidonTabClick(inttabId);
  157. }
  158. }
这是MainActivity这个类里面的两个static类,看我写的注释和上篇博客的内容应该都能理解。其中还定义了触摸事件,实现点击tab出现不同布局的效果。接下来我们只需要在我们的layout上添加就可以了,我们继续写一个内部类

  1. publicstaticclassiRelativeLayoutextendsRelativeLayout//注意,还是声明为静态
  2. {
  3. privatePaintmPaint;
  4. privateRectmRect;
  5. publiciRelativeLayout(Contextcontext,AttributeSetattrs)
  6. {
  7. super(context,attrs);
  8. mRect=newRect();
  9. mPaint=newPaint();
  10. mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
  11. mPaint.setColor(0xFFCBD2D8);
  12. }
  13. @Override
  14. protectedvoidonDraw(Canvascanvas)
  15. {
  16. super.onDraw(canvas);
  17. canvas.drawColor(0xFFC5CCD4);
  18. this.getDrawingRect(mRect);
  19. for(inti=0;i<mRect.right;i+=7)//绘制屏幕背景的纹理效果
  20. {
  21. canvas.drawRect(mRect.left+i,mRect.top,mRect.left+i+2,mRect.bottom,mPaint);
  22. }
  23. }
  24. }
  25. privatestaticfinalintTAB_HIGHLIGHT=1;
  26. privatestaticfinalintTAB_CHAT=2;
  27. privatestaticfinalintTAB_LOOPBACK=3;
  28. privatestaticfinalintTAB_REDO=4;
  29. privateiTabmTabs;
  30. privateLinearLayoutmTabLayout_One;
  31. privateLinearLayoutmTabLayout_Two;
  32. privateLinearLayoutmTabLayout_Three;
  33. privateLinearLayoutmTabLayout_Four;
  34. privateLinearLayoutmTabLayout_Five;
  35. @Override
  36. publicvoidonCreate(BundlesavedInstanceState)
  37. {
  38. super.onCreate(savedInstanceState);
  39. setContentView(R.layout.main);
  40. mTabs=(iTab)this.findViewById(R.id.Tabs);
  41. mTabLayout_One=(LinearLayout)this.findViewById(R.id.TabLayout_One);
  42. mTabLayout_Two=(LinearLayout)this.findViewById(R.id.TabLayout_Two);
  43. mTabLayout_Three=(LinearLayout)this.findViewById(R.id.TabLayout_Three);
  44. mTabLayout_Four=(LinearLayout)this.findViewById(R.id.TabLayout_Four);
  45. mTabLayout_Five=(LinearLayout)this.findViewById(R.id.TabLayout_Four);//偷个懒,不写第五个界面啦
  46. mTabs.addTabMember(newTabMember(TAB_HIGHLIGHT,"精选",R.drawable.jingxuan));
  47. mTabs.addTabMember(newTabMember(TAB_CHAT,"类别",R.drawable.cat));
  48. mTabs.addTabMember(newTabMember(TAB_LOOPBACK,"25大排行榜",R.drawable.rank));
  49. mTabs.addTabMember(newTabMember(TAB_REDO,"搜索",R.drawable.search));
  50. mTabs.addTabMember(newTabMember(TAB_REDO,"更新",R.drawable.download));//添加tab
  51. /*初始显示第一个界面*/
  52. mTabLayout_One.setVisibility(View.VISIBLE);
  53. mTabLayout_Two.setVisibility(View.GONE);
  54. mTabLayout_Three.setVisibility(View.GONE);
  55. mTabLayout_Four.setVisibility(View.GONE);
  56. mTabs.setOnTabClickListener(newOnTabClickListener(){
  57. @Override
  58. publicvoidonTabClick(inttabId)//实现点击事件
  59. {
  60. if(tabId==TAB_HIGHLIGHT)
  61. {
  62. mTabLayout_One.setVisibility(View.VISIBLE);
  63. mTabLayout_Two.setVisibility(View.GONE);
  64. mTabLayout_Three.setVisibility(View.GONE);
  65. mTabLayout_Four.setVisibility(View.GONE);
  66. }elseif(tabId==TAB_CHAT)
  67. {
  68. mTabLayout_One.setVisibility(View.GONE);
  69. mTabLayout_Two.setVisibility(View.VISIBLE);
  70. mTabLayout_Three.setVisibility(View.GONE);
  71. mTabLayout_Four.setVisibility(View.GONE);
  72. }elseif(tabId==TAB_LOOPBACK)
  73. {
  74. mTabLayout_One.setVisibility(View.GONE);
  75. mTabLayout_Two.setVisibility(View.GONE);
  76. mTabLayout_Three.setVisibility(View.VISIBLE);
  77. mTabLayout_Four.setVisibility(View.GONE);
  78. }elseif(tabId==TAB_REDO)
  79. {
  80. mTabLayout_One.setVisibility(View.GONE);
  81. mTabLayout_Two.setVisibility(View.GONE);
  82. mTabLayout_Three.setVisibility(View.GONE);
  83. mTabLayout_Four.setVisibility(View.VISIBLE);
  84. }
  85. }
  86. });
  87. }
其中onDraw()方法里面实现了背景的纹理效果,配合xml里面背景色的配置,实现了如下图所示的效果:


是不是非常漂亮呢,剩下的就是在xml里面配置了

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <viewxmlns:android="http://schemas.android.com/apk/res/android"
  3. class="com.notice520.MainActivity$iRelativeLayout"
  4. android:orientation="vertical"
  5. android:layout_width="fill_parent"
  6. android:layout_height="fill_parent"
  7. android:background="#C5CCD4FF"
  8. >
  9. <LinearLayout
  10. android:id="@+id/TabLayout_One"
  11. android:layout_width="fill_parent"
  12. android:layout_height="fill_parent"
  13. android:layout_above="@+id/Tabs"
  14. >
  15. <ScrollViewandroid:layout_width="fill_parent"android:layout_height="wrap_content">
  16. <RelativeLayout
  17. android:layout_width="fill_parent"
  18. android:layout_height="fill_parent"
  19. android:visibility="visible"
  20. >
  21. <TextView
  22. android:textColor="@android:color/black"
  23. android:textSize="30sp"
  24. android:layout_width="wrap_content"
  25. android:layout_height="wrap_content"
  26. android:text="春节快乐!!"
  27. />
  28. </RelativeLayout>
  29. </ScrollView>
  30. </LinearLayout>
  31. <LinearLayout
  32. android:id="@+id/TabLayout_Two"
  33. android:layout_width="fill_parent"
  34. android:layout_height="fill_parent"
  35. android:layout_above="@+id/Tabs"
  36. >
  37. <ScrollViewandroid:layout_width="fill_parent"android:layout_height="wrap_content">
  38. <RelativeLayout
  39. android:layout_width="fill_parent"
  40. android:layout_height="fill_parent"
  41. android:visibility="visible"
  42. android:layout_above="@+id/Tabs"
  43. >
  44. <Button
  45. android:layout_width="wrap_content"
  46. android:layout_height="wrap_content"
  47. android:text="祝大家事业有成!"
  48. android:textSize="30sp"
  49. />
  50. </RelativeLayout>
  51. </ScrollView>
  52. </LinearLayout>
  53. <LinearLayout
  54. android:id="@+id/TabLayout_Three"
  55. android:layout_width="fill_parent"
  56. android:layout_height="fill_parent"
  57. android:layout_above="@+id/Tabs"
  58. >
  59. <ScrollViewandroid:layout_width="fill_parent"android:layout_height="wrap_content">
  60. <RelativeLayout
  61. android:layout_width="fill_parent"
  62. android:layout_height="fill_parent"
  63. android:visibility="visible"
  64. android:layout_above="@+id/Tabs"
  65. >
  66. <ImageView
  67. android:layout_width="fill_parent"
  68. android:layout_height="fill_parent"
  69. android:src="@drawable/newq"
  70. />
  71. </RelativeLayout>
  72. </ScrollView>
  73. </LinearLayout>
  74. <LinearLayout
  75. android:id="@+id/TabLayout_Four"
  76. android:layout_width="fill_parent"
  77. android:layout_height="fill_parent"
  78. android:layout_above="@+id/Tabs"
  79. >
  80. <ScrollViewandroid:layout_width="fill_parent"android:layout_height="wrap_content">
  81. <RelativeLayout
  82. android:id="@+id/TabLayout_Four"
  83. android:layout_width="fill_parent"
  84. android:layout_height="fill_parent"
  85. android:visibility="visible"
  86. android:layout_above="@+id/Tabs"
  87. >
  88. <TextView
  89. android:textColor="@android:color/black"
  90. android:layout_width="wrap_content"
  91. android:layout_height="wrap_content"
  92. android:text="很简单,是么"
  93. />
  94. </RelativeLayout>
  95. </ScrollView>
  96. </LinearLayout>
  97. <view
  98. class="com.notice520.MainActivity$iTab"
  99. android:id="@+id/Tabs"
  100. android:layout_width="fill_parent"
  101. android:layout_height="49px"
  102. android:layout_alignParentBottom="true"
  103. />
  104. </view>

来看看最终效果吧

是不是还不错呢 有问题可以留言交流。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics