今天我们通过使用Android提供给我们的现有空间Gallery和ImageSwitcher来实现一个幻灯片式的图片浏览器。
(1)首先我们新建一个工程,修改主布局文件activity_main.xml内容如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center_horizontal" android:orientation="vertical" > <ImageSwitcher android:id="@+id/image_switcher" android:layout_width="wrap_content" android:layout_height="0dip" android:layout_weight="2" android:paddingTop="30dip" /> <!-- android:layout_weight 详细解释:按比例显示LinearLayout内各个子控件, 需设置android:layout_width="0dp", 如果为竖直方向的设置android:layout_height="0dp"。 在这种情况下某子个控件占用LinearLayout的比例为: 本控件weight值 / LinearLayout内所有控件的weight值的和。 android:spacing 设置图片的间距 android:unselectedAlpha 设置为选中条目的透明度 --> <Gallery android:id="@+id/gallery" android:layout_width="fill_parent" android:layout_height="0dip" android:layout_weight="1" android:spacing="5dip" android:unselectedAlpha="0.6" /> </LinearLayout>
public class MainActivity extends Activity { // 声明并静态初始化图片id数组 private int[] imageIds = { R.drawable.img01, R.drawable.img02, R.drawable.img03, R.drawable.img04, R.drawable.img05, R.drawable.img06, R.drawable.img07, R.drawable.img08, R.drawable.img09, R.drawable.img10, R.drawable.img11, R.drawable.img12 }; // 声明一个Gallery视图控件变量 private Gallery gallery; // 声明一个ImageSwitcher视图控件变量 private ImageSwitcher imageSwitcher; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 获取视图控件对象 gallery = (Gallery) findViewById(R.id.gallery); imageSwitcher = (ImageSwitcher) findViewById(R.id.image_switcher); // 设置动画效果 imageSwitcher.setInAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_in)); imageSwitcher.setOutAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_out)); // 为imageSwitcher设置ViewFactory对象 imageSwitcher.setFactory(new ViewFactory() { @Override public View makeView() { // 初始化一个ImageView对象 ImageView imageView = new ImageView(MainActivity.this); // 设置保持纵横比居中缩放图像 imageView.setScaleType(ImageView.ScaleType.FIT_CENTER); // 设置imageView的宽高 imageView.setLayoutParams(new FrameLayout.LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); return imageView; } }); //初始化一个MainGalleryAdapter对象 MainGalleryAdapter adapter = new MainGalleryAdapter(); //将适配器与gallery关联起来 gallery.setAdapter(adapter); //初始选中中间的图片 gallery.setSelection(imageIds.length/2); gallery.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { //在ImageSwitcher中显示选中的图片 imageSwitcher.setImageResource(imageIds[position]); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } /** * 定义Gallery的数据适配器MainGalleryAdapter */ class MainGalleryAdapter extends BaseAdapter { /** * 获得数量 */ @Override public int getCount() { return imageIds.length; } /** * 获得当前选项 */ @Override public Object getItem(int position) { return getResources().getDrawable(imageIds[position]); } /** * 获得当前选项的id */ @Override public long getItemId(int position) { return position; } /** * 获得当前选项的视图 */ @Override public View getView(int position, View convertView, ViewGroup parent) { //初始化一个ImageView对象 ImageView imageView = new ImageView(MainActivity.this); //设置缩放方式 imageView.setScaleType(ImageView.ScaleType.FIT_XY); //设置ImageView的宽高 imageView.setLayoutParams(new Gallery.LayoutParams(180, 135)); //设置IamgeView显示的图片 imageView.setImageResource(imageIds[position]); /** * 设置ImageView背景,这里背景使用的是android提供的一种背景风格 * 在values/attr.xml文件中需要一下内容 * <declare-styleable name="Gallery"> * <attr name="android:galleryItemBackground" /> * </declare-styleable> */ TypedArray typedArray = MainActivity.this .obtainStyledAttributes(R.styleable.Gallery); int mGalleryItemBackground = typedArray.getResourceId( R.styleable.Gallery_android_galleryItemBackground, 0); imageView.setBackgroundResource(mGalleryItemBackground); //返回ImageView对象 return imageView; } } }
(3)我们看一下程序运行后的效果图:
(4)附上完整的android源码: