您当前位置:设计在线网 >> Android >> 浏览文章

简述用gallery实现可滑动的Tab

分享到:
本文章讲述了简述用gallery实现可滑动的Tab.

最近有

很多事情要忙,一直没有更新博客,今天得空来写一写。话说春天什么时候来,还是冷兮兮的。

今天还是来讲下Tab的实现。android自带的Tab在有比较多条目的时候会显得非常挤,这样不仅不美观,更加影响操作。如果Tab能做成左右滑动的,那就非常好了。其实实现这种效果并不难,而且方法也不少。今天给大家介绍下用gallery这个组件来实现的方法。

首先我们需要写Gallery的适配器。这里我们要注意的是Gallery有一个特点,就是起始一个元素的左边会留下一块空位,如下图所示:

这样我们的Tab显然不是很完美,如何解决?开始想的就是去看gallery的源码,重写他。不过既然我们做的是滑动的,让他左右都可滑动不就ok了?要实现左右滑动,要做的事情就是让里面的元素循环。Gallery是即时显示图像的,可以通过两点来做到:

1.让getCount()方法返回一个非常大的值。

2.在getView()中显示的时候通过循环取余来实现一直显示数组中的有限值。

而且Gallery还提供了一个setSelection()方法,用来设置当前选择的条目,我们将显示的位置放在比较靠后的位置,这样就不会在左滑的时候滑到头,那样就可以以假乱真了。

下面来看下适配器代码:

1 publicclass TabAdapterextends BaseAdapter{

2 private Context mContext;

3 private List String mList;

4 privateint mSelectedTab;

5 6public TabAdapter(Context context,List String list){

7 mContext=context;

8/*使用attrs里的declare-styleable属性*/

9 TypedArray a=obtainStyledAttributes(R.styleable.Gallery);

10 a.recycle();//重复使用对象的styleable属性

11 if(list==null)

12 list=Collections.emptyList();

13 mList=list;

14}

15/*

16*设置选中的Tab,并且刷新界面

17*/

18 publicvoid setSelectedTab(int tab){

19 if(tab!=mSelectedTab){

20 mSelectedTab=tab;

21 notifyDataSetChanged();

22}

23}

24 25 publicint getSelectedTab(){

26 return mSelectedTab;

27}

28 29 publicint getCount(){

30 return Integer.MAX_VALUE;//返回最大值

31}

32 33 public Object getItem(int position){

34 return mList.get(position);

35}

36 37 publiclong getItemId(int position){

38 return position;

39}

40 41 public View getView(int position,View convertView,ViewGroup parent){

42 TextView text=null;//这里只放一个TextView,可以根据需要来定制

43 if(convertView==null){

44 text=new TextView(mContext);

45}else{

46 text=(TextView)convertView;

47}

48 49 text.setTextColor(Color.WHITE);

50 text.setText(mList.get(position%mList.size()));//循环取余设置显示内容

51 52 text.setLayoutParams(new Gallery.LayoutParams(102,40));

53 text.setGravity(Gravity.CENTER);

54 55/*

56*对于选中的Tab,给他一个选中的背景

57*/

58 if(position==mSelectedTab)

59 text.setBackgroundResource(R.drawable.tab_button_select);

60 else 61 text.setBackgroundResource(R.drawable.tab_button_unselect);

62 63 return text;

64}

65}注释已经写的很清楚了,应该没什么问题。

这里程序中使用了

TypedArray a=obtainStyledAttributes(R.styleable.Gallery);

a.recycle();//重复使用对象的styleable属性这是一个引用自制layout元素的用法,必须在res/values下面添加一个attrs.xml,并在其中定义declare-styleable标签TAG,目的是自定义layout的背景风格,并且通过TypeArray的特性,让相同的Layout元素可以重复用于每一张图片,大家可以看下apiDemos里gallery1s的用法,这里也是参考它的用法。看下attrs.xml的代码:

?xml version="1.0"encoding="utf-8"?

resources declare-styleablename="Gallery"

attrname="android:galleryItemBackground"/

/declare-styleable

/resources还要说一点的是,对于选中和未选中的背景处理。我们在onItemClick中得到选中的Tab,然后为选中的和未选中的设置一个背景。这个背景这里用自定义图形shape的方法来定义,在res/drawable下新建xml文件,tab_button_select.xml中内容如下:

1?xml version="1.0"encoding="utf-8"?

2 shapexmlns:android="

3 gradientandroid:startColor="#FFA2A2A2"android:endColor="#FF5F5F5F"

4 android:angle="90.0"

5/gradient 6/shape其中的gradient标签实现一个从startColor到endColor角度为90渐变色。其实我们经常用这种方式来自定义我们的控件,可以用来实现圆角,渐变,描边等效果,分别在shape根节点下用gradient,corners,stroke标签实现,大家可以自己去试试,效果还是很好的,也很简单。

推荐阅读:
有关Android数据库知识基本总结
对于Android线程模型理解分析
介绍基于Android中几种布局方式
推荐文章  
赞助商链接  
热门排行  
主题推广  
中国设计在线网 All Rights Reserved. 互联网违法和不良信息举报
信息产业部备案号:湘ICP备09001063号