Android--UI之Gallery

分享到:

前言

  这篇博客讲解一下Android开发中,Gallery控件的使用,这是一个画廊视图,用于展示一组图片,用固定在中间位置的水平滚动列表显示列表项的视图。Android最新的API文档中了解到,在Android4.1(Android API level16)之后,就不再赞成使用这个控件,但还对其有支持,所以这里简单讲解一下如何使用。在这篇博客中,将了解到Gallery的一些常用属性、方法、以及样式的设置,最后会以一个小示例来展示如何使用Gallery展示一个画廊的效果。

 

Gallery

  Gallery与Spinner两个控件具有共同的父类:AbsSpinner,表示Gallery和Spinner都是一个列表框。它们之间的区别在于Spinner显示的是一个垂直的列表选择框,而Gallery显示的是一个水平的列表选择框,而且支持水平滑动的效果。Gallery与Spinner还有一个区别:Spinner的作用是供用户选择,而Gallery则允许用户通过拖动来查看上一个、下一个列表项。对于Spinner,在我的另外一篇博客中有详细讲解,有兴趣的朋友可以看看:Android--UI之Spinner

  下面介绍一下Gallery的常用XML属性,Android也为其属性提供了相应的getter、setter方法:

  • android:animationDuration:设置列表项切换时的动画持续时间,使用毫秒为单位。
  • android:gravity:设置列表项的对其方式。
  • android:spacing:设置Gallery内列表项之间的间距。
  • android:unselectedAlpha:设置没有被选中的列表项的透明度,范围是一个为0~1的float数,越接近0越透明。

  作为一个列表框,它和Spinner一样,声明的事件也是定义在AdapterView类中,常用事件有如下几个:

  • AdapterView.OnItemCLickListener:列表项被点击时触发。
  • AdapterView.OnItemLongClickListener:列表项被长按时触发。
  • AdapterView.OnItemSelectedListener:列表项被选择时触发。 

Gallery的数据绑定

  Gallery本身的用法非常简单,基本上与Spinner的用法相似,只要为它提供一个Adapter适配器即可。如果需要响应Gallery上用户的操作,可以监听上面介绍的几个事件。

  Adapter适配器的概念,在我的另外一篇博客中有讲解,有兴趣的朋友可以看看,Android--UI之AutoCompleteTextView。而对于Gallery的Adapter适配器,虽然可以直接实现Adapter接口,但是一般推荐继承另外一个抽象类:BaseAdapter,它已经实现了一些常用的方法。对于BaseAdapter而言,继承它必须要实现几个方法,下面先了解一下这几个方法:

  • int getCount():当前适配器中存在多少个数据项。
  • Object getItem(int position):返回数据集中指定位置的数据项。
  • long getItemId(int position):返回数据集中指定位置的数据行Id。
  • View getView(int position,View convertView,ViewGroup parent):返回一个视图,用于显示数据集中指定位置的数据项。

  对于BaseAdapter的getView()方法,这里着重讲解一下。在绑定Adapter适配器之后,系统会根据getCount()方法返回的数据项,循环调用getView()方法,用于返回每个position位置的显示视图,所以对于一个Adapter适配器,其主要的代码量就在getView()方法中。因为BaseAdapter的getView()方法返回的是一个View数据,所以一般自定义的展示效果都会用到BaseAdapter来做父类,继承实现其中的方法来实现自定义的View来展示在UI界面上,

 

示例程序

  下面通过一个示例说明上面讲到的知识点,在这个示例程序中,使用一个Gallery来展示一组图片的画廊效果,大部分项目中用到的也是这种效果,但是它展示的是一个View,所以并不是仅仅可以用来显示图片,这里只是用图片进行演示。在示例程序中还声明了一个ImageView,用于显示从Gallery中选中的图片,对于ImageView的用法,请参见另外一篇博客:ImageView的使用,这里就不在累述了。 

  因为是显示一个图片的画廊效果,所以需要准备一组图片,这些图片放在res/drawable-hdpi目录下,这些图片会随着项目源码一起打包到源码中的。

  布局代码: 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Gallery Demo" />
    <!-- 定义一个Gallery,其中动画换进3秒,数据项间隔3dp,透明度为50% -->
    <Gallery
        android:id="@+id/gallery1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:animationDuration="3000"
        android:spacing="3dp"
        android:unselectedAlpha="0.5" />

    <ImageView
        android:id="@+id/image1"
        android:layout_width="320dp"
        android:layout_height="250dp"
        android:scaleType="fitXY" />

</LinearLayout>
昵    称:
验证码:

相关文档: