4.10 心爱小宝贝相片集Gallery与衍生BaseAdapter容器

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该图片的编号

范例程序

 
 
  1. src/irdc.ex04_10/EX04_10.java 

主程序有两大重点:第一,是ImageAdapter继承BaseAdapter class的未实现方法的重写构造;第二,则是Gallery的OnItemClick()方法与图片及Layout宽高设置。

 

 
 
  1. /* import程序略 */  
  2.  
  3. public class EX04_10 extends Activity   
  4. {  
  5.   /** Called when the activity is first created. */  
  6.   @Override  
  7.   public void onCreate(Bundle savedInstanceState)   
  8.   {  
  9.     super.onCreate(savedInstanceState);  
  10.     setContentView(R.layout.main);  
  11.     /*通过findViewById取得*/  
  12.     Gallery g = (Gallery) findViewById(R.id.mygallery);  
  13.     /* 添加一ImageAdapter并设置给Gallery对象 */  
  14.     g.setAdapter(new ImageAdapter(this));  
  15.       
  16.     /* 设置一个itemclickListener并Toast被单击图片的位置 */  
  17.     g.setOnItemClickListener(new OnItemClickListener()   
  18.     {  
  19.       public void onItemClick  
  20.       (AdapterView<?> parent, View v, int position, long id)  
  21.       {  
  22.         Toast.makeText  
  23.         (EX04_10.this, getString(R.string.my_gallery_text_pre)  
  24.         + position+ getString(R.string.my_gallery_text_post),   
  25.         Toast.LENGTH_SHORT).show();  
  26.       }  
  27.     });  
  28.   }  
  29.     
  30.   /* 改写BaseAdapter自定义一ImageAdapter class */  
  31.   public class ImageAdapter extends BaseAdapter   
  32.   {  
  33.     /*声明变量*/  
  34.     int mGalleryItemBackground;  
  35.     private Context mContext;  
  36.       
  37.     /*ImageAdapter的构造器*/  
  38.     public ImageAdapter(Context c)   
  39.     {  
  40.       mContext = c;  
  41.         
  42.       /* 使用在res/values/attrs.xml中的<declare-styleable>定义  
  43.       * 的Gallery属性.*/  
  44.       TypedArray a = obtainStyledAttributes(R.styleable.Gallery);  
  45.         
  46.       /*取得Gallery属性的Index id*/  
  47.       mGalleryItemBackground = a.getResourceId  
  48.       (R.styleable.Gallery_android_galleryItemBackground, 0);  
  49.         
  50.       /*让对象的styleable属性能够反复使用*/   
  51.       a.recycle();  
  52.     }  
  53.       
  54.     /* 重写的方法getCount,返回图片数目 */  
  55.     public int getCount()   
  56.     {  
  57.       return myImageIds.length;  
  58.     }  
  59.            
  60.     /* 重写的方法getItemId,返回图像的数组id */  
  61.  
  62.     public Object getItem(int position)   
  63.     {  
  64.       return position;  
  65.     }  
  66.     public long getItemId(int position)   
  67.     {  
  68.       return position;  
  69.     }  
  70.       
  71.     /* 重写的方法getView,返回一View对象 */  
  72.     public View getView  
  73.     (int position, View convertView, ViewGroup parent)  
  74.     {  
  75.       /*产生ImageView对象*/  
  76.       ImageView i = new ImageView(mContext);  
  77.       /*设置图片给imageView对象*/  
  78.       i.setImageResource(myImageIds[position]);  
  79.       /*重新设置图片的宽高*/  
  80.       i.setScaleType(ImageView.ScaleType.FIT_XY);  
  81.       /*重新设置Layout的宽高*/  
  82.       i.setLayoutParams(new Gallery.LayoutParams(136, 88));  
  83.       /*设置Gallery背景图*/  
  84.       i.setBackgroundResource(mGalleryItemBackground);  
  85.       /*返回imageView对象*/  
  86.       return i;  
  87.     }  
  88.       
  89.     /*构建一Integer array并取得预加载Drawable的图片id*/  
  90.     private Integer[] myImageIds =   
  91.     {  
  92.       R.drawable.photo1,  
  93.       R.drawable.photo2,  
  94.       R.drawable.photo3,  
  95.       R.drawable.photo4,  
  96.       R.drawable.photo5,  
  97.       R.drawable.photo6,  
  98.     };     
  99.   }   

res/values/attrs.xml

定义Layout外部Resource的XML文件,用来改变Layout的背景图。

 
 
  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <resources> 
  3.   <declare-styleable name="Gallery"> 
  4.     <attr name="android:galleryItemBackground" /> 
  5.   </declare-styleable>   
  6. </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


另外,在主程序中,我们使用了下面这一段写法:

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

这是一个引用自制Layout元素的用法,必须在res/values下面添加一个attrs.xml,并在其中定义<declare-styleable>标签TAG,目的是自定义Layout的背景风格,并且通过TypeArray的特性,让相同的Layout元素可以重复用于每一张图片。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值