Gallery结合案例详解

Gallery(相册)控件是个很不错的图片查看控件,屏幕中有一个图片列表,Gallery类的继承关系如下: 
java.lang.Object 
   ↳ android.view.View 
     ↳ android.view.ViewGroup 
       ↳ android.widget.AdapterView<T extends android.widget.Adapter> 
         ↳ android.widget.AbsSpinner 
           ↳ android.widget.Gallery 
这个Gallery案例,可以用手滑动Gallery,当用户点击某个图片弹出一个Toast,如6-11图: 
  
 

6-11 Gallery控件使用效果图 
程序代码请参考代码清单6-9: 
【代码清单6-9】 chapter6_5/src/com/work/GalleryActivity.java 
public class GalleryActivity extends Activity { 
@Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 

        Gallery g = (Gallery) findViewById(R.id.gallery); 
        g.setAdapter(new ImageAdapter(this)); 
        g.setOnItemClickListener(new OnItemClickListener() { 
            public void onItemClick(AdapterView parent, View v, int position, long id) { 
                Toast.makeText(GalleryActivity.this, "" + position, Toast.LENGTH_SHORT).show(); 
            } 
        }); 
        
        registerForContextMenu(g); 
    } 

    @Override 
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { 
        menu.add(R.string.gallerytext); 
    } 
    
    @Override 
    public boolean onContextItemSelected(MenuItem item) { 
        AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); 
        Toast.makeText(this, "Longpress: " + info.position, Toast.LENGTH_SHORT).show(); 
        return true; 
    } 

    public class ImageAdapter extends BaseAdapter { 
        int mGalleryItemBackground; 
        
        public ImageAdapter(Context c) { 
            mContext = c; 
            TypedArray a = obtainStyledAttributes(R.styleable.Gallery1); 
            mGalleryItemBackground = a.getResourceId( 
                    R.styleable.Gallery1_android_galleryItemBackground, 0); 
            a.recycle(); 
        } 

        public int getCount() { 
            return mImageIds.length; 
        } 

        public Object getItem(int position) { 
            return position; 
        } 

        public long getItemId(int position) { 
            return position; 
        } 

        public View getView(int position, View convertView, ViewGroup parent) {        
ImageView imageView; 
imageView = new ImageView(mContext); 
imageView.setImageResource(mImageIds[position]);   //此处要是gallery循环这几个图像,可以使用取余的方法来循环取这个数组的值 :imageView.setimageResource( mImageIds[position% mImageIds.length]);    position设为Integer.MAX_VALUE
imageView.setScaleType(ImageView.ScaleType.FIT_XY); 
imageView.setLayoutParams(new Gallery.LayoutParams(136, 88)); 
imageView.setBackgroundResource(mGalleryItemBackground); 
return imageView; 
        } 

        private Context mContext; 

        private Integer[] mImageIds = { 
                R.drawable.beijing, 
                R.drawable.changsha, 
                R.drawable.chengdu, 
                R.drawable.chongqing, 
                R.drawable.haerbing, 
                R.drawable.jinan, 
                R.drawable.jiujiang, 
                R.drawable.kunming, 
                R.drawable.nanjing 
        }; 
    } 

代码的关键的地方是实现BaseAdapter适配器类——ImageAdapter,其中关键是getView()实现。在convertView为null时候实例化控件,imageView.setLayoutParams(new GridView.LayoutParams(136, 88)是设置一个单元格中图片的大小是136×88像素。imageView.setScaleType(ImageView.ScaleType.FIT_XY) 缩放图片使用FILL方式。imageView.setImageResource(mImageIds[position])为图片控件设置图片。 
在布局文件/chapter6_5/res/layout/main.xml中添加Gallery控件: 
<?xml version="1.0" encoding="utf-8"?> 
<Gallery xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/gallery" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
/> 
本例中设置图片的背景样式是边框样式,如图6-12。 
  
 

图6-12 图片背景样式 
imageView.setBackgroundResource(mGalleryItemBackground)语句就是设定样式的,成员变量mGalleryItemBackground是在ImageAdapter的构造方法中初始化的。 
public ImageAdapter(Context c) { 
mContext = c; 
TypedArray a = obtainStyledAttributes(R.styleable.Gallery1); 
mGalleryItemBackground = a.getResourceId( 
R.styleable.Gallery1_android_galleryItemBackground, 0); 
a.recycle(); 

mGalleryItemBackground是与galleryItemBackground背景资源绑定的id值,这个id对应的galleryItemBackground属性就是设定带有边框的背景样式。 
此外还要在chapter6_5/res/values/目录下面创建一个attrs.xml文件: 
<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <declare-styleable name="Gallery1"> 
        <attr name="android:galleryItemBackground" /> 
    </declare-styleable> 
</resources> 
这是一个自定义控件属性的xml文件。但是在Android1.0时候没有这么麻烦,而是如下方式实现: 
public ImageAdapter(Context c) { 
        mContext = c; 
        TypedArray a = obtainStyledAttributes(android.R.styleable.Theme); 
        mGalleryItemBackground = a.getResourceId( 
                android.R.styleable.Theme_galleryItemBackground, 0); 
        a.recycle(); 

android.R.styleable.Theme_galleryItemBackground 属性在Android1.0是可以访问的,而在Android1.0之后就不能访问了,而要通过本例的方式获得galleryItemBackground的id值。 
                                                                   出自《Android开发案例驱动教程》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值