Gallery
Gallery是一个布局小部件,用来在一个水平滚动列表里显示内容,被选中的内容会被放置在中间位置。
本教程里,将创建一个相册,当某张图片被选中时,会弹出一个文本消息。
- 创建工程:HelloGallery.
- 要么自己找一些照片,要么使用示例图片。将图片保存到
res/drawable/
目录下. - 打开
res/layout/main.xml
文件并修改如下:<?xml version="1.0" encoding="utf-8"?> <Gallery xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/gallery" android:layout_width="fill_parent" android:layout_height="wrap_content" />
- 打开
HelloGallery.java
并修改onCreate()
方法如下:@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Gallery gallery = (Gallery) findViewById(R.id.gallery); gallery.setAdapter(new ImageAdapter(this)); gallery.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView parent, View v, int position, long id) { Toast.makeText(HelloGallery.this, "" + position, Toast.LENGTH_SHORT).show(); } }); }
首先加载main.xml布局文件,然后通过
findViewById(int)获得对Gallery的引用。实例化一个继承自BaseAdapter的类ImageAdapter(将在下面定义),然后调用setAdapter()方法将ImageAdapter装载到Gallery上。再实例化一个匿名的AdapterView.OnItemClickListener项目点击事件监听器。回调函数
onItemClick(AdapterView, View, int, long)
收到的参数有:发生点击事件的AdapterView,收到点击的View,View被点击的位置,和被点击项目所在的行号(如果有的话)。这个例子里,所需要的信息就是被点击的位置,利用makeText(Context, CharSequence, int)
和show()
方法来弹出一个文本消息显示被点击项目的位置。(在现实世界的场景里,ID可以用来为某些任务获得全尺寸图片。) - 在
res/values/
目录下创建一个XML文件attrs.xml,内容如下
:<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="HelloGallery"> <attr name="android:galleryItemBackground" /> </declare-styleable> </resources>
这是一个定制显示风格的资源,可以应用到界面上。这个例子里,它将定制Gallery里面的一个个项目的显示风格。
- 回到
HelloGallery.java
文件,在onCreate(Bundle)
方法之后,定义一个ImageAdapter
内嵌类:public class ImageAdapter extends BaseAdapter { int mGalleryItemBackground; private Context mContext; private Integer[] mImageIds = { R.drawable.sample_1, R.drawable.sample_2, R.drawable.sample_3, R.drawable.sample_4, R.drawable.sample_5, R.drawable.sample_6, R.drawable.sample_7 }; public ImageAdapter(Context c) { mContext = c; TypedArray attr = mContext.obtainStyledAttributes(R.styleable.HelloGallery); mGalleryItemBackground = attr.getResourceId( R.styleable.HelloGallery_android_galleryItemBackground, 0); attr.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 = new ImageView(mContext); imageView.setImageResource(mImageIds[position]); imageView.setLayoutParams(new Gallery.LayoutParams(150, 100)); imageView.setScaleType(ImageView.ScaleType.FIT_XY); imageView.setBackgroundResource(mGalleryItemBackground); return imageView; } }
首先,有一些成员变量,包括一个ID的数组,用来引用存放在res/drawable/下的图像资源。下一步是定义构造函数,参数是Context,定制风格资源(上一步定义的)的引用被保存到局部变量。构造函数的最后,调用recycle()方法让TypeArray能被系统复用。getCount()、getItem(int)和getItemId(int)必须实现,为Adapter适配器提供简单的查询功能。
getView()方法并不是为ImageView提供一个图片,而是利用Context创建一个ImageView。为创建的ImageView做以下几点:根据位置参数从图片资源数组取一个图片设置到ImageView里;设置图片的宽高;设置显示比例以适应ImageView的尺寸;最后,设置背景为在构造函数里取得的风格化资源。
参考
ImageView.ScaleType
看看其他的比例选项。 - 运行应用。
应该能看到如下画面: