今天把这个仿iphone效果的tab写完,这个例子参考国外rolle3k共享的代码,感谢rolle3k。
上篇博客我们写了一个Itab类,介绍了背景的绘制和简单的一个图的贴图方法。我们继续来完成Itab这个类,同时把他放到MainAcitvity(继承Activity)这个类内部,这样,整个程序只需一个类就可以了。(上篇博客例子运行需要再建一个Activity的子类来作为lanucher)。废话不多说了,看看代码
-
publicstaticclassiTabextendsView
-
{
-
privatePaintmPaint;
-
privatePaintmActiveTextPaint;
-
privatePaintmInactiveTextPaint;
-
privateArrayList<TabMember>mTabMembers;
-
privateintmActiveTab;
-
privateOnTabClickListenermOnTabClickListener=null;
-
-
publiciTab(Contextcontext,AttributeSetattrs)
-
{
-
super(context,attrs);
-
-
mTabMembers=newArrayList<MainActivity.iTab.TabMember>();
-
-
mPaint=newPaint();
-
mActiveTextPaint=newPaint();
-
mInactiveTextPaint=newPaint();
-
-
mPaint.setStyle(Paint.Style.FILL);
-
mPaint.setColor(0xFFFFFF00);
-
mPaint.setAntiAlias(true);
-
-
mActiveTextPaint.setTextAlign(Align.CENTER);
-
mActiveTextPaint.setTextSize(12);
-
mActiveTextPaint.setColor(0xFFFFFFFF);
-
mActiveTextPaint.setAntiAlias(true);
-
-
-
mInactiveTextPaint.setTextAlign(Align.CENTER);
-
mInactiveTextPaint.setTextSize(12);
-
mInactiveTextPaint.setColor(0xFF999999);
-
mInactiveTextPaint.setAntiAlias(true);
-
mActiveTab=0;
-
-
}
-
-
@Override
-
protectedvoidonDraw(Canvascanvas)
-
{
-
super.onDraw(canvas);
-
-
Rectr=newRect();
-
this.getDrawingRect(r);
-
-
-
intsingleTabWidth=r.right/(mTabMembers.size()!=0?mTabMembers.size():1);
-
-
-
-
canvas.drawColor(0xFF000000);
-
mPaint.setColor(0xFF434343);
-
canvas.drawLine(r.left,r.top+1,r.right,r.top+1,mPaint);
-
-
intcolor=46;
-
-
for(inti=0;i<24;i++)
-
{
-
mPaint.setARGB(255,color,color,color);
-
canvas.drawRect(r.left,r.top+i+1,r.right,r.top+i+2,mPaint);
-
color--;
-
}
-
-
for(inti=0;i<mTabMembers.size();i++)
-
{
-
TabMembertabMember=mTabMembers.get(i);
-
-
Bitmapicon=BitmapFactory.decodeResource(getResources(),tabMember.getIconResourceId());
-
BitmapiconColored=Bitmap.createBitmap(icon.getWidth(),icon.getHeight(),Bitmap.Config.ARGB_8888);
-
Paintp=newPaint(Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG);
-
CanvasiconCanvas=newCanvas();
-
iconCanvas.setBitmap(iconColored);
-
-
if(mActiveTab==i)
-
{
-
p.setShader(newLinearGradient(0,0,icon.getWidth(),icon.getHeight(),
-
0xFFFFFFFF,0xFF54C7E1,Shader.TileMode.CLAMP));
-
}
-
else{
-
p.setShader(newLinearGradient(0,0,icon.getWidth(),icon.getHeight(),
-
0xFFA2A2A2,0xFF5F5F5F,Shader.TileMode.CLAMP));
-
}
-
-
iconCanvas.drawRect(0,0,icon.getWidth(),icon.getHeight(),p);
-
-
for(intx=0;x<icon.getWidth();x++)
-
{
-
for(inty=0;y<icon.getHeight();y++)
-
{
-
if((icon.getPixel(x,y)&0xFF000000)==0)
-
{
-
iconColored.setPixel(x,y,0x00000000);
-
}
-
}
-
}
-
-
-
inttabImgX=singleTabWidth*i+(singleTabWidth/2-icon.getWidth()/2);
-
-
-
if(mActiveTab==i)
-
{
-
mPaint.setARGB(37,255,255,255);
-
canvas.drawRoundRect(newRectF(r.left+singleTabWidth*i+3,r.top+3,
-
r.left+singleTabWidth*(i+1)-3,r.bottom-2),5,5,mPaint);
-
canvas.drawBitmap(iconColored,tabImgX,r.top+5,null);
-
canvas.drawText(tabMember.getText(),
-
singleTabWidth*i+(singleTabWidth/2),r.bottom-2,mActiveTextPaint);
-
}else
-
{
-
canvas.drawBitmap(iconColored,tabImgX,r.top+5,null);
-
canvas.drawText(tabMember.getText(),
-
singleTabWidth*i+(singleTabWidth/2),r.bottom-2,mInactiveTextPaint);
-
}
-
}
-
}
-
-
-
-
@Override
-
publicbooleanonTouchEvent(MotionEventmotionEvent)
-
{
-
Rectr=newRect();
-
this.getDrawingRect(r);
-
floatsingleTabWidth=r.right/(mTabMembers.size()!=0?mTabMembers.size():1);
-
-
intpressedTab=(int)((motionEvent.getX()/singleTabWidth)-(motionEvent.getX()/singleTabWidth)%1);
-
-
mActiveTab=pressedTab;
-
-
if(this.mOnTabClickListener!=null)
-
{
-
this.mOnTabClickListener.onTabClick(mTabMembers.get(pressedTab).getId());
-
}
-
-
this.invalidate();
-
-
returnsuper.onTouchEvent(motionEvent);
-
}
-
-
voidaddTabMember(TabMembertabMember)
-
{
-
mTabMembers.add(tabMember);
-
}
-
-
voidsetOnTabClickListener(OnTabClickListeneronTabClickListener)
-
{
-
mOnTabClickListener=onTabClickListener;
-
}
-
-
publicstaticclassTabMember
-
{
-
protectedintmId;
-
protectedStringmText;
-
protectedintmIconResourceId;
-
-
TabMember(intId,StringText,inticonResourceId)
-
{
-
mId=Id;
-
mIconResourceId=iconResourceId;
-
mText=Text;
-
}
-
-
publicintgetId()
-
{
-
returnmId;
-
}
-
-
publicStringgetText()
-
{
-
returnmText;
-
}
-
-
publicintgetIconResourceId()
-
{
-
returnmIconResourceId;
-
}
-
-
publicvoidsetText(StringText)
-
{
-
mText=Text;
-
}
-
-
publicvoidsetIconResourceId(inticonResourceId)
-
{
-
mIconResourceId=iconResourceId;
-
}
-
}
-
-
publicstaticinterfaceOnTabClickListener
-
{
-
publicabstractvoidonTabClick(inttabId);
-
}
-
}
这是MainActivity这个类里面的两个static类,看我写的注释和上篇博客的内容应该都能理解。其中还定义了触摸事件,实现点击tab出现不同布局的效果。接下来我们只需要在我们的layout上添加就可以了,我们继续写一个内部类
-
publicstaticclassiRelativeLayoutextendsRelativeLayout
-
{
-
privatePaintmPaint;
-
privateRectmRect;
-
-
publiciRelativeLayout(Contextcontext,AttributeSetattrs)
-
{
-
super(context,attrs);
-
-
mRect=newRect();
-
mPaint=newPaint();
-
-
mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
-
mPaint.setColor(0xFFCBD2D8);
-
}
-
-
@Override
-
protectedvoidonDraw(Canvascanvas)
-
{
-
super.onDraw(canvas);
-
canvas.drawColor(0xFFC5CCD4);
-
-
this.getDrawingRect(mRect);
-
-
for(inti=0;i<mRect.right;i+=7)
-
{
-
canvas.drawRect(mRect.left+i,mRect.top,mRect.left+i+2,mRect.bottom,mPaint);
-
}
-
}
-
}
-
-
privatestaticfinalintTAB_HIGHLIGHT=1;
-
privatestaticfinalintTAB_CHAT=2;
-
privatestaticfinalintTAB_LOOPBACK=3;
-
privatestaticfinalintTAB_REDO=4;
-
privateiTabmTabs;
-
privateLinearLayoutmTabLayout_One;
-
privateLinearLayoutmTabLayout_Two;
-
privateLinearLayoutmTabLayout_Three;
-
privateLinearLayoutmTabLayout_Four;
-
privateLinearLayoutmTabLayout_Five;
-
-
@Override
-
publicvoidonCreate(BundlesavedInstanceState)
-
{
-
super.onCreate(savedInstanceState);
-
setContentView(R.layout.main);
-
-
mTabs=(iTab)this.findViewById(R.id.Tabs);
-
mTabLayout_One=(LinearLayout)this.findViewById(R.id.TabLayout_One);
-
mTabLayout_Two=(LinearLayout)this.findViewById(R.id.TabLayout_Two);
-
mTabLayout_Three=(LinearLayout)this.findViewById(R.id.TabLayout_Three);
-
mTabLayout_Four=(LinearLayout)this.findViewById(R.id.TabLayout_Four);
-
mTabLayout_Five=(LinearLayout)this.findViewById(R.id.TabLayout_Four);
-
-
mTabs.addTabMember(newTabMember(TAB_HIGHLIGHT,"精选",R.drawable.jingxuan));
-
mTabs.addTabMember(newTabMember(TAB_CHAT,"类别",R.drawable.cat));
-
mTabs.addTabMember(newTabMember(TAB_LOOPBACK,"25大排行榜",R.drawable.rank));
-
mTabs.addTabMember(newTabMember(TAB_REDO,"搜索",R.drawable.search));
-
mTabs.addTabMember(newTabMember(TAB_REDO,"更新",R.drawable.download));
-
-
-
mTabLayout_One.setVisibility(View.VISIBLE);
-
mTabLayout_Two.setVisibility(View.GONE);
-
mTabLayout_Three.setVisibility(View.GONE);
-
mTabLayout_Four.setVisibility(View.GONE);
-
-
mTabs.setOnTabClickListener(newOnTabClickListener(){
-
@Override
-
publicvoidonTabClick(inttabId)
-
{
-
if(tabId==TAB_HIGHLIGHT)
-
{
-
mTabLayout_One.setVisibility(View.VISIBLE);
-
mTabLayout_Two.setVisibility(View.GONE);
-
mTabLayout_Three.setVisibility(View.GONE);
-
mTabLayout_Four.setVisibility(View.GONE);
-
}elseif(tabId==TAB_CHAT)
-
{
-
mTabLayout_One.setVisibility(View.GONE);
-
mTabLayout_Two.setVisibility(View.VISIBLE);
-
mTabLayout_Three.setVisibility(View.GONE);
-
mTabLayout_Four.setVisibility(View.GONE);
-
}elseif(tabId==TAB_LOOPBACK)
-
{
-
mTabLayout_One.setVisibility(View.GONE);
-
mTabLayout_Two.setVisibility(View.GONE);
-
mTabLayout_Three.setVisibility(View.VISIBLE);
-
mTabLayout_Four.setVisibility(View.GONE);
-
}elseif(tabId==TAB_REDO)
-
{
-
mTabLayout_One.setVisibility(View.GONE);
-
mTabLayout_Two.setVisibility(View.GONE);
-
mTabLayout_Three.setVisibility(View.GONE);
-
mTabLayout_Four.setVisibility(View.VISIBLE);
-
}
-
}
-
});
-
}
其中onDraw()方法里面实现了背景的纹理效果,配合xml里面背景色的配置,实现了如下图所示的效果:
是不是非常漂亮呢,剩下的就是在xml里面配置了
来看看最终效果吧
是不是还不错呢 有问题可以留言交流。
分享到:
相关推荐
android UI进阶之实现listview中checkbox的多选与记录
androidUI进阶之实现listview的下拉加载.pdf
android_UI进阶之style和theme的总结,供学习交流,谢谢~
android_UI进阶之实现listview的下拉加载,实用简单
android页面滑动效果。
该文档详细介绍了listView的分页加载
android仿iphone滚轮UI效果。源码实现
android UI进阶之android中隐藏的layout 抽屉的使用方法,需要的朋友可以参考一下
自UI工作原理:Viewgroup/View/Window/WindowManager之间关系 Android事件分发机制 View重要属性和方法 自定义控件实现
Android Drawable 概述 Bitmap & .9.png Shape XML StateListDrawable Android图形编程 类简介 Canvas Paint Typeface
UI之高仿iphone短信发送气泡效果,已经测试,请放心使用,在android2.3下即可运行
Android 基于TabLayout实现的TAB页导航切换效果 仿今日头条底部的TAB选项卡效果,TabLayout与ViewPager结合使用可以达到点击tab更新ViewPager、滑动ViewPager更新Tab的效果。这种效果现在在PC端、移动设备端已经很...
本项目是一个高仿微米UI的项目,虽然是个UI项目但是很多东西还是值得学习和借鉴的,例如里面漂亮的仿IOS开关、仿QQ的圆角退出登录按钮 、字母索引、图文混编、九宫格图片多选、二维码扫描、仿微信的附近的人列表、仿...
第05章 UI进阶.html
最初的下拉加载应该是ios上的效果,现在很多应用如新浪微博等都加入了这个操作。即下拉listview刷新列表,这无疑是一个非常友好的操作。今天就和大家分享下这个操作的实现。先看下运行效果: 代码参考国外朋友...
安卓Android源码——UI设计之 仿做蘑菇街UI设计 源码.zip
仿iPHONE UI C#源码 仿iPHONE UI C#源码 仿iPHONE UI C#源码
现在的大多数应用都会有一个欢迎引导页面如图所示通过左右滑动来告知用户一些功能特性这个引导图效果用ViewPager可以很轻松的实现 正如前面所说ViewPager是用来展示一组数据的所以肯定需要Adapter来绑定数据和v