- 浏览: 7356929 次
- 性别:
- 来自: 上海
-
文章分类
- 全部博客 (1546)
- 企业中间件 (236)
- 企业应用面临的问题 (236)
- 小布Oracle学习笔记汇总 (36)
- Spring 开发应用 (54)
- IBatis开发应用 (16)
- Oracle基础学习 (23)
- struts2.0 (41)
- JVM&ClassLoader&GC (16)
- JQuery的开发应用 (17)
- WebService的开发应用 (21)
- Java&Socket (44)
- 开源组件的应用 (254)
- 常用Javascript的开发应用 (28)
- J2EE开发技术指南 (163)
- EJB3开发应用 (11)
- GIS&Mobile&MAP (36)
- SWT-GEF-RCP (52)
- 算法&数据结构 (6)
- Apache开源组件研究 (62)
- Hibernate 学习应用 (57)
- java并发编程 (59)
- MySQL&Mongodb&MS/SQL (15)
- Oracle数据库实验室 (55)
- 搜索引擎的开发应用 (34)
- 软件工程师笔试经典 (14)
- 其他杂项 (10)
- AndroidPn& MQTT&C2DM&推技术 (29)
- ActiveMQ学习和研究 (38)
- Google技术应用开发和API分析 (11)
- flex的学习总结 (59)
- 项目中一点总结 (20)
- java疑惑 java面向对象编程 (28)
- Android 开发学习 (133)
- linux和UNIX的总结 (37)
- Titanium学习总结 (20)
- JQueryMobile学习总结 (34)
- Phonegap学习总结 (32)
- HTML5学习总结 (41)
- JeeCMS研究和理解分析 (9)
最新评论
-
lgh1992314:
[u][i][b][flash=200,200][url][i ...
看看mybatis 源代码 -
尼古拉斯.fwp:
图片根本就不出来好吧。。。。。。
Android文件图片上传的详细讲解(一)HTTP multipart/form-data 上传报文格式实现手机端上传 -
ln94223:
第一个应该用排它网关吧 怎么是并行网关, 并行网关是所有exe ...
工作流Activiti的学习总结(八)Activiti自动执行的应用 -
ZY199266:
获取不到任何消息信息,请问这是什么原因呢?
ActiveMQ 通过JMX监控Connection,Queue,Topic的信息 -
xiaoyao霄:
DestinationSourceMonitor 报错 应该导 ...
ActiveMQ 通过JMX监控Connection,Queue,Topic的信息
今天还是来讲下Tab的实现。android自带的Tab在有比较多条目的时候会显得非常挤,这样不仅不美观,更加影响操作。如果Tab能做成左右滑动的,那就非常好了。其实实现这种效果并不难,而且方法也不少。今天给大家介绍下用gallery这个组件来实现的方法。
首先我们需要写Gallery的适配器。这里我们要注意的是Gallery有一个特点,就是起始一个元素的左边会留下一块空位,如下图所示:
这样我们的Tab显然不是很完美,如何解决?开始想的就是去看gallery的源码,重写他。不过既然我们做的是滑动的,让他左右都可滑动不就ok了?要实现左右滑动,要做的事情就是让里面的元素循环。Gallery是即时显示图像的,可以通过两点来做到:
1.让getCount()方法返回一个非常大的值。
2.在getView()中显示的时候通过循环取余来实现一直显示数组中的有限值。
而且Gallery还提供了一个setSelection()方法,用来设置当前选择的条目,我们将显示的位置放在比较靠后的位置,这样就不会在左滑的时候滑到头,那样就可以以假乱真了。
下面来看下适配器代码:
2 private Context mContext;
3 private List<String> mList;
4 private int mSelectedTab;
5
6 public 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 public void setSelectedTab(int tab) {
19 if (tab != mSelectedTab) {
20 mSelectedTab = tab;
21 notifyDataSetChanged();
22 }
23 }
24
25 public int getSelectedTab() {
26 return mSelectedTab;
27 }
28
29 public int getCount() {
30 return Integer.MAX_VALUE;//返回最大值
31 }
32
33 public Object getItem(int position) {
34 return mList.get(position);
35 }
36
37 public long 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 }
注释已经写的很清楚了,应该没什么问题。
这里程序中使用了
a.recycle();//重复使用对象的styleable属性
这是一个引用自制layout 元素的用法,必须在res/values 下面添加一个attrs.xml,并在其中定义 <declare-styleable> 标签TAG,目的是自定义layout 的背景风格,并且通过TypeArray 的特性,让相同的Layout 元素可以重复用于每一张图片,大家可以看下apiDemos里gallery1s的用法,这里也是参考它的用法。看下attrs.xml的代码:
<resources>
<declare-styleable name="Gallery">
<attr name="android:galleryItemBackground" />
</declare-styleable>
</resources>
还要说一点的是,对于选中和未选中的背景处理。我们在onItemClick中得到选中的Tab,然后为选中的和未选中的设置一个背景。这个背景这里用自定义图形shape的方法来定义,在res/drawable下新建xml文件,tab_button_select.xml中内容如下:
1 <?xml version="1.0" encoding="utf-8"?> 2 <shape xmlns:android="http://schemas.android.com/apk/res/android"> 3 <gradient android:startColor="#FFA2A2A2" android:endColor="#FF5F5F5F" 4 android:angle="90.0"> 5 </gradient> 6</shape>
其中的gradient标签实现一个从startColor到endColor角度为90渐变色。其实我们经常用这种方式来自定义我们的控件,可以用来实现圆角,渐变,描边等效果,分别在shape根节点下用gradient,corners,stroke标签实现,大家可以自己去试试,效果还是很好的,也很简单。
下面来看下MainActivity的代码,显示layout的方法和我以前一篇仿Iphone效果的Tab中一样,通过隐藏和显示相应的layout来实现。当然,也可以通过intent来指向不同的Activity等方法来做。注意定义要显示的Tab数组的时候,因为我们第一个显示的不是第一个Tab,所以适当调整下数组的定义顺序,同样对应的layou也是。
2
3 private Gallery gallery;
4 private TabAdapter textAdapter;
5
6 private static final String[] TAB_NAMES = {
7
8 "第四个",
9 "第一个",
10 "第二个",
11 "第三个",
12 };
13
14 private LinearLayout mTabLayout_One;
15 private LinearLayout mTabLayout_Two;
16 private LinearLayout mTabLayout_Three;
17 private LinearLayout mTabLayout_Four;
18
19 @Override
20 public void onCreate(Bundle savedInstanceState) {
21 super.onCreate(savedInstanceState);
22 setContentView(R.layout.main);
23
24 gallery = (Gallery) findViewById(R.id.gallery);
25 textAdapter = new TabAdapter(this, Arrays.asList(TAB_NAMES));
26 gallery.setAdapter(textAdapter);
27 gallery.setSelection(34);//这里根据你的Tab数自己算一下,让左边的稍微多一点,不要一滑就滑到头
28
29 mTabLayout_One = (LinearLayout) this.findViewById( R.id.TabLayout_One );
30 mTabLayout_Two = (LinearLayout) this.findViewById( R.id.TabLayout_Two );
31 mTabLayout_Three = (LinearLayout) this.findViewById( R.id.TabLayout_Three );
32 mTabLayout_Four = (LinearLayout) this.findViewById( R.id.TabLayout_Four );
33
34 mTabLayout_One.setVisibility( View.GONE );
35 mTabLayout_Two.setVisibility( View.VISIBLE );
36 mTabLayout_Three.setVisibility( View.GONE );
37 mTabLayout_Four.setVisibility( View.GONE );
38
39 gallery.setOnItemClickListener(new OnItemClickListener() {
40
41 @Override
42 public void onItemClick(AdapterView<?> parent, View view, int position,
43 long id) {
44 TabAdapter adapter = (TabAdapter)parent.getAdapter();
45 adapter.setSelectedTab(position);
46 switch(position %TAB_NAMES.length ){
47 case 0:
48 mTabLayout_One.setVisibility( View.VISIBLE );
49 mTabLayout_Two.setVisibility( View.GONE );
50 mTabLayout_Three.setVisibility( View.GONE );
51 mTabLayout_Four.setVisibility( View.GONE );
52 break;
53 case 1:
54 mTabLayout_One.setVisibility( View.GONE );
55 mTabLayout_Two.setVisibility( View.VISIBLE );
56 mTabLayout_Three.setVisibility( View.GONE );
57 mTabLayout_Four.setVisibility( View.GONE );
58 break;
59 case 2:
60 mTabLayout_One.setVisibility( View.GONE );
61 mTabLayout_Two.setVisibility( View.GONE );
62 mTabLayout_Three.setVisibility( View.VISIBLE );
63 mTabLayout_Four.setVisibility( View.GONE );
64 break;
65 case 3:
66 mTabLayout_One.setVisibility( View.GONE );
67 mTabLayout_Two.setVisibility( View.GONE );
68 mTabLayout_Three.setVisibility( View.GONE );
69 mTabLayout_Four.setVisibility( View.VISIBLE );
70 }
71
72 }
73
74 });
75
76 }
77 }
最后就是main.xml布局文件了:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#C5CCD4FF">
<LinearLayout
android:id = "@+id/TabLayout_One"
android:layout_width = "fill_parent"
android:layout_height = "fill_parent"
android:layout_below = "@+id/gallery"
>
<TextView
android:textColor="@android:color/black"
android:textSize="30sp"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:text = "这是第四个布局"
/>
</LinearLayout>
<LinearLayout
android:id = "@+id/TabLayout_Two"
android:layout_width = "fill_parent"
android:layout_height = "fill_parent"
android:layout_below = "@+id/gallery"
>
<Button
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:text = "这是第一个布局"
android:textSize = "30sp"
/>
</LinearLayout>
<LinearLayout
android:id = "@+id/TabLayout_Three"
android:layout_width = "fill_parent"
android:layout_height = "fill_parent"
android:layout_below = "@+id/gallery"
>
<TextView
android:layout_width = "fill_parent"
android:layout_height = "fill_parent"
android:textSize="25sp"
android:textColor="#ffffff"
android:text="你觉得怎么样?"
/>
</LinearLayout>
<LinearLayout
android:id = "@+id/TabLayout_Four"
android:layout_width = "fill_parent"
android:layout_height = "fill_parent"
android:layout_below = "@+id/gallery"
>
<TextView
android:textColor="@android:color/black"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:text = "很简单,是么"
/>
</LinearLayout>
<Gallery
android:id="@+id/gallery"
android:layout_alignParentTop="true"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:unselectedAlpha="1"
android:spacing="1dip"/>
</RelativeLayout>
这样我们用gallery实现的可滑动的Tab就完成了,看下最后的效果。
大家有什么问题可以留言交流哈。特别是对让左边不留空的方法有好的解决办法的话,希望能提出来,大家一起学习交流。
发表评论
-
[转]年度最实用50款免费Android应用推荐
2012-11-08 16:39 3388据国外媒体报道,有人说Android应用市场比iPhone应用 ... -
GIS的学习(四十五)【转】Integration of the MBTiles format on Android
2012-10-22 17:13 2960转载自 http:/ ... -
GIS的学习(四十四)osmdroid sdcard检查
2012-10-15 16:12 2351在许多应用中使用到sdcard的检查,在osmdro ... -
GIS的学习(四十三)osmdroid基于几个经典代理类
2012-10-15 16:06 2644在osmdroid中给基于位置的代理类如下: pack ... -
Android中PopupWindow的用法(位置、动画、焦点)
2012-10-12 14:12 11542在Android中有很多级别的Window,不同级别的Wind ... -
【转】Android根据分辨率进行单位转换-(dp,sp转像素px)
2012-10-11 09:18 27148Android系统中,默认的单位是像素(px)。也就是说,在没 ... -
GIS的学习(二十九)Osmdroid 离线地图存放位置的研究和详细分析
2012-09-23 11:49 11597在手机通过osmdroid调用离线地图必须放在 ... -
GIS的学习(二十八)Osmdroid相关的开源项目
2012-09-23 11:31 25475osm 数据格式(openstreet map)与Ro ... -
GIS的学习(二十七)通过geoserver的georss访问第三方地图
2012-09-23 00:34 3613在geoserver中如果想调用第三方地图可以采 ... -
android中使用 定时更新界面定时器Timer的使用
2012-09-22 22:09 25541handler的使用 一、Handler的定义: ... -
【转】Android应用程序的自动更新升级(自身升级、通过tomcat) .
2012-09-16 15:03 7379http://blog.csdn.net/mu0206mu/a ... -
GIS的学习(二十七)OGC 的WCS WFS 及WMS 服务
2012-09-11 22:22 12165http://www.gisall.com/?6678/v ... -
GIS的学习(二十六)geotools 使用 部分代码总结
2012-09-11 22:20 5765前段时间的一个项目 本来用ae完成了种种的 查询,空间分析等等 ... -
GIS的学习(二十五)geoserver wms中的各种操作API详细讲解和使用
2012-09-10 17:42 9725官方geoserver中WMS服务中几种操作的API的详细说明 ... -
GIS的学习(二十四)android异步调用geoserver wms中的地图
2012-09-10 17:38 8189在geoserver的客户端通过wms的GetMap实现 ... -
GIS的学习(二十三)geoserver中CQL和ECQL的使用
2012-09-10 16:29 6659以下引用自官方文档: CQL and ECQL¶ CQ ... -
GIS的学习(二十二)osmdroid中添加縮放控件
2012-09-06 23:09 2796package com.geoserver.osmdroid; ... -
GIS的学习(二十一)在osmdroid 地图中添加marker 并添加事件
2012-09-06 22:27 6665我有 osmdroid,overlayswithf ... -
GIS的学习(二十)基于Geoserver的WFS服务与Openlayers实现地理查询
2012-08-30 18:48 11429基于Geoserver发布的wfs服务,与Openlayers ... -
GIS的学习(十九)Geoserver使用添加,删除,查询地图中的POI
2012-08-30 17:28 10378在geoserver自定义的地图中通过geoserver ...
相关推荐
在Android应用开发中,创建一个具有滑动Tab、Gif动画显示和Gallery画廊自动切换显示的功能是一项常见的需求。这个项目结合了多个组件和技术,旨在提供丰富的用户交互体验。接下来,我们将深入探讨这些知识点。 首先...
总的来说,"android gallery 导航TAB样式 非常的漂亮和实用"这个主题涉及到Android UI设计中的关键元素,包括`Gallery`的使用、自定义适配器、以及与`TabHost`和`TabWidget`的集成。通过这样的实践,开发者可以提升...
- 使用Android Studio的调试工具检查内存泄漏和性能瓶颈。 总的来说,`Android 使用Gallery_tabhost实现标签效果图源码.rar`是一个实用的示例,帮助开发者了解如何结合使用`Gallery`和`TabHost`组件创建具有动态...
HorizontalScrollView允许用户水平滑动查看内容,而ViewPager更适合作为页面滑动的容器,特别是在实现图片轮播或Tab布局时。 在实际开发中,我们还需要了解如何自定义控件。这可能涉及到重写控件的属性、事件监听器...
"3D滑动页面效果关联gallery滑动"是一个高级交互设计,它利用ViewPager组件和自定义布局来实现3D翻页效果,并与Gallery组件进行联动,为用户提供更加直观且富有立体感的浏览体验。以下将详细介绍这一技术的实现过程...
在Android开发中,UI设计和用户体验是至关重要的因素。标题提到的"TabLayout"、"ListView"、"Gallery"和“手势滑动”是Android应用中常见的组件和技术,它们组合在一起可以创建出丰富的交互界面。这里我们将深入探讨...
总的来说,这个源码示例展示了如何在旧版Android API中利用`Gallery`和`TabHost`实现滑动标签页,对于理解Android UI组件的使用有一定帮助。然而,对于新项目,建议使用更现代、官方推荐的`ViewPager`和`TabLayout`...
总的来说,这个项目为开发者提供了一个实践Android UI设计和交互的实例,特别是对于那些想要学习如何使用Gallery和TabHost创建复杂、互动性强的界面的开发者来说,这是一个非常有价值的资源。通过分析和理解这个源码...
在Android开发中,`Gallery`和`TabHost`是两种重要的UI组件,它们可以用于创建丰富多样的用户界面。在这个源码压缩包中,开发者利用这两个组件实现了标签切换的效果,通常这种效果在很多应用的主界面中都能见到,...
这个"移动应用Android 使用Gallery-tabhost实现标签效果图源码.rar"的资源提供了一种方法来构建一个动态且吸引人的UI,结合了Gallery和TabHost组件。下面我们将深入探讨这两个组件以及如何在实际应用中结合使用它们...
Gallery组件在早期的Android API中被广泛使用,作为一个可滚动的视图,展示一系列的项目,通常用于图片轮播。现在,虽然Gallery已被废弃,但其概念依然存在,开发者常通过ViewPager或HorizontalScrollView来实现...
在Android开发中,TabHost和Gallery是两个非常重要的组件,它们分别用于实现多标签页的切换和图片轮播效果。本文将深入解析这两个组件的使用方法,并通过一个经典的实例来展示它们如何协同工作。 首先,TabHost是...
`RecyclerView`可以自由定制布局管理器,支持水平和垂直滚动,而`ViewPager`则更适合实现页面滑动的界面,如Tab页。 总的来说,虽然`Gallery`在现代Android开发中不再主流,但理解它的原理和使用方式对于学习...
简明、完整、全面的安卓开发demo集合,包含如下示例 1、LinearLayout Button、RadioGroup、 CheckBox ...50、Fragment + ViewPager实现tab滑动切换 51、能够显示在桌面前面的的歌词效果 52、activity切换特效
在Android开发中,创建用户界面是一项重要的任务,而标签(Tab)效果是常见的UI设计元素,常用于组织和展示多视图内容。本教程将详细讲解如何使用`Gallery`和`TabHost`来实现这样的效果。`Gallery`是Android提供的一...
初学者必看 1、LinearLayout Button、RadioGroup、 CheckBox 2、TableLayout 3、FrameLayout 霓虹灯效果 ...50、Fragment + ViewPager实现tab滑动切换 51、能够显示在桌面前面的的歌词效果 52、activity切换特效
在描述中提到的"用Viewpager 模仿Gallery",意味着开发者将创建一个定制的`ViewPager`实现,以便用户可以像在`Gallery`中那样快速左右滑动,同时保持`ViewPager`的特性,如自动滚动、手势识别和页面间平滑过渡。...
接下来是商品图片的滑动展示,这部分可以使用`Gallery`或者`ViewPager`来实现,通过设置滑动监听器,可以实现平滑的图片浏览效果。如果需要更复杂的交互,例如手势拖动,可能需要自定义一个`View`或` ViewGroup`,并...
漂亮Tab插件之jQuery自动切换轮播Tab选项卡示例代码 10.实用jquery+CSS实现流畅tab切换效果(Coda-Slider 1.1.1)插件 11.实用jquery标签Tab插件下载可切换不同的颜色 12.推荐jquery仿淘宝网商品排行榜展示切换...