4.10 心爱小宝贝相片集Gallery与衍生BaseAdapter容器
范例说明
还记得在第3章"Gallery画廊"范例中,为了简化问题,使用了Android默认的Icon作为Gallery显示的内容吗?现在,将数张PNG图片导入Drawable当中,并于onCreate的同时,载入于Gallery Widget中,试着再添加一个OnItemClick的事件,以取得图片的ID编号来响应用户单击图片时的状态,完成Gallery的高级使用。本范例的另一个重点,就是如何设置Gallery图片的宽高以及放置图片Layout的大小,在此我们改写一个继承自BaseAdapter的ImageAdapter容器来存放图片,通过ImageView.setScaleType()的方法来改变图片的显示,再通过setLayoutParams()方法来改变Layout的宽高。
运行结果(见图4-10)
![]() |
图4-10 程序启动后会显示res/drawable中的图片,单击任一图片会Toast该图片的编号 |
范例程序
- src/irdc.ex04_10/EX04_10.java
主程序有两大重点:第一,是ImageAdapter继承BaseAdapter class的未实现方法的重写构造;第二,则是Gallery的OnItemClick()方法与图片及Layout宽高设置。
- /* import程序略 */
- public class EX04_10 extends Activity
- {
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- /*通过findViewById取得*/
- Gallery g = (Gallery) findViewById(R.id.mygallery);
- /* 添加一ImageAdapter并设置给Gallery对象 */
- g.setAdapter(new ImageAdapter(this));
- /* 设置一个itemclickListener并Toast被单击图片的位置 */
- g.setOnItemClickListener(new OnItemClickListener()
- {
- public void onItemClick
- (AdapterView<?> parent, View v, int position, long id)
- {
- Toast.makeText
- (EX04_10.this, getString(R.string.my_gallery_text_pre)
- + position+ getString(R.string.my_gallery_text_post),
- Toast.LENGTH_SHORT).show();
- }
- });
- }
- /* 改写BaseAdapter自定义一ImageAdapter class */
- public class ImageAdapter extends BaseAdapter
- {
- /*声明变量*/
- int mGalleryItemBackground;
- private Context mContext;
- /*ImageAdapter的构造器*/
- public ImageAdapter(Context c)
- {
- mContext = c;
- /* 使用在res/values/attrs.xml中的<declare-styleable>定义
- * 的Gallery属性.*/
- TypedArray a = obtainStyledAttributes(R.styleable.Gallery);
- /*取得Gallery属性的Index id*/
- mGalleryItemBackground = a.getResourceId
- (R.styleable.Gallery_android_galleryItemBackground, 0);
- /*让对象的styleable属性能够反复使用*/
- a.recycle();
- }
- /* 重写的方法getCount,返回图片数目 */
- public int getCount()
- {
- return myImageIds.length;
- }
- /* 重写的方法getItemId,返回图像的数组id */
- public Object getItem(int position)
- {
- return position;
- }
- public long getItemId(int position)
- {
- return position;
- }
- /* 重写的方法getView,返回一View对象 */
- public View getView
- (int position, View convertView, ViewGroup parent)
- {
- /*产生ImageView对象*/
- ImageView i = new ImageView(mContext);
- /*设置图片给imageView对象*/
- i.setImageResource(myImageIds[position]);
- /*重新设置图片的宽高*/
- i.setScaleType(ImageView.ScaleType.FIT_XY);
- /*重新设置Layout的宽高*/
- i.setLayoutParams(new Gallery.LayoutParams(136, 88));
- /*设置Gallery背景图*/
- i.setBackgroundResource(mGalleryItemBackground);
- /*返回imageView对象*/
- return i;
- }
- /*构建一Integer array并取得预加载Drawable的图片id*/
- private Integer[] myImageIds =
- {
- R.drawable.photo1,
- R.drawable.photo2,
- R.drawable.photo3,
- R.drawable.photo4,
- R.drawable.photo5,
- R.drawable.photo6,
- };
- }
- }
res/values/attrs.xml
定义Layout外部Resource的XML文件,用来改变Layout的背景图。
- <?xml version="1.0" encoding="utf-8"?>
- <resources>
- <declare-styleable name="Gallery">
- <attr name="android:galleryItemBackground" />
- </declare-styleable>
- </resources>
扩展学习
在Android:ScaleType中定义了下列常数可供使用,通过"ObjectView.ScaleType常数名称"的方式,就可以改变图片的显示方式,如表4-1所示。
表4-1 各常数名称所代表的值
常 数 名 称 | 值 |
| 常 数 名 称 | 值 |
Matrix | 0 | fitEnd | 4 | |
fitXY | 1 | center | 5 | |
fitStart | 2 | centerCrop | 6 | |
fitCenter | 3 | centerInside | 7 |
另外,在主程序中,我们使用了下面这一段写法:
- TypedArray a = obtainStyledAttributes(R.styleable.Gallery);
这是一个引用自制Layout元素的用法,必须在res/values下面添加一个attrs.xml,并在其中定义<declare-styleable>标签TAG,目的是自定义Layout的背景风格,并且通过TypeArray的特性,让相同的Layout元素可以重复用于每一张图片。