在Android平台上,创建一个图片画廊应用是一种常见的需求。这种应用可以让用户横向滚动浏览一系列图片,并在点击某张图片时放大显示。本文将介绍如何实现这样一个应用。
在本示例应用中,创建了一个包含固定图片的画廊。这些图片被复制到项目的res/drawable
文件夹中。用户可以通过横向滚动来浏览所有图片,点击画廊中的图片可以在ImageView
控件中以更大的尺寸显示。
在MainActivity.java
文件中,通过以下方式引用res/drawable
文件夹中的图片:
Integer[] imageIDs = {R.drawable.pic1, R.drawable.pic2, R.drawable.pic3, R.drawable.pic4, R.drawable.pic5, R.drawable.pic6, R.drawable.pic7};
在activity_main.xml
文件中,创建了一个包含TextView
、Gallery
和ImageView
控件的线性布局:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="My Image Gallery"/>
<Gallery
android:id="@+id/mygallery"
android:layout_marginLeft="15dp"
android:layout_marginTop="25dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<ImageView
android:id="@+id/myimage"
android:layout_marginLeft="15dp"
android:layout_marginTop="25dp"
android:layout_width="330dp"
android:layout_height="250dp"
android:scaleType="fitXY"/>
</LinearLayout>
在res/values
文件夹中添加了一个名为attrs.xml
的文件,并在其中添加了以下代码:
<resources>
<declare-styleable name="MyGallery">
<attr name="android:galleryItemBackground"/>
</declare-styleable>
</resources>
在MainActivity.java
文件中,通过以下方式获取Gallery
对象:
Gallery gallery = (Gallery) findViewById(R.id.mygallery);
gallery.setAdapter(new ImageAdapter(this));
gallery.setOnItemClickListener(this);
在上面的代码中,使用Gallery
类的setAdapter()
方法来指定画廊使用的数据和数据格式,使用内部类ImageAdapter
。setOnItemClickListener()
方法注册了一个回调方法,当画廊中的图片被点击时会被调用。
以下是ImageAdapter
内部类的代码:
public class ImageAdapter extends BaseAdapter {
Context ctx;
int itemBackground;
public ImageAdapter(Context ctx) {
this.ctx = ctx;
TypedArray array = obtainStyledAttributes(R.styleable.MyGallery);
itemBackground = array.getResourceId(R.styleable.MyGallery_android_galleryItemBackground, 0);
array.recycle();
}
public int getCount() {
return imageIDs.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(ctx);
imageView.setImageResource(imageIDs[position]);
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
imageView.setLayoutParams(new Gallery.LayoutParams(150, 120));
imageView.setBackgroundResource(itemBackground);
return imageView;
}
}
在上面的代码中,ImageAdapter
内部类继承自BaseAdapter
类。在该类的构造函数中,使用obtainStyledAttributes()
方法获取上下文中的主题样式属性,并存储在TypedArray
对象中。recycle()
方法用于重用对象。getView()
方法返回一个ImageView
,代表在画廊中显示的图片,基于位置。setImageResource()
方法设置一个drawable作为这个ImageView
的内容。setScaleType()
方法指定图片在ImageView
中的大小和位置。setLayoutParams()
方法指定ImageView
的布局参数。setBackgroundResource()
方法设置ImageView
的背景。
以下是onItemClick()
回调方法的代码,当画廊中的图片被点击时,该方法会被调用,并在ImageView
对象中显示选中的图片:
public void onItemClick(AdapterView adapterView, View view, int position, long id) {
ImageView imageView = (ImageView) findViewById(R.id.myimage);
imageView.setImageResource(imageIDs[position]);
}
以下是MainActivity.java
文件的完整代码:
package com.example.azim.mygalleryapp;
import android.content.Context;
import android.content.res.TypedArray;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.Gallery;
import android.widget.ImageView;
public class MainActivity extends AppCompatActivity implements AdapterView.OnItemClickListener {
Integer[] imageIDs = {R.drawable.pic1, R.drawable.pic2, R.drawable.pic3, R.drawable.pic4, R.drawable.pic5, R.drawable.pic6, R.drawable.pic7};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Gallery gallery = (Gallery) findViewById(R.id.mygallery);
gallery.setAdapter(new ImageAdapter(this));
gallery.setOnItemClickListener(this);
}
public void onItemClick(AdapterView adapterView, View view, int position, long id) {
ImageView imageView = (ImageView) findViewById(R.id.myimage);
imageView.setImageResource(imageIDs[position]);
}
public class ImageAdapter extends BaseAdapter {
Context ctx;
int itemBackground;
public ImageAdapter(Context ctx) {
this.ctx = ctx;
TypedArray array = obtainStyledAttributes(R.styleable.MyGallery);
itemBackground = array.getResourceId(R.styleable.MyGallery_android_galleryItemBackground, 0);
array.recycle();
}
public int getCount() {
return imageIDs.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(ctx);
imageView.setImageResource(imageIDs[position]);
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
imageView.setLayoutParams(new Gallery.LayoutParams(150, 120));
imageView.setBackgroundResource(itemBackground);
return imageView;
}
}
}