上次讲了如何使用Gallery控件,这次就讲Gallery 与ImageSwitcher的结合使用,本文实现一个简单的浏览图片的功能。先贴出程序运行截图:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageSwitcher android:id="@+id/switcher" android:layout_width="match_parent" android:layout_height="match_parent"/> <Gallery android:id="@+id/gallery" android:background="#55000000" android:layout_width="match_parent" android:layout_alignParentBottom="true" android:layout_alignParentLeft="true" android:gravity="center_vertical" android:spacing="16dp" android:layout_height="100dp"/> </RelativeLayout>
package com.testImageView; import java.lang.reflect.Field; import java.util.ArrayList; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.view.ViewGroup; import android.view.animation.AnimationUtils; import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.Gallery; import android.widget.ImageSwitcher; import android.widget.ImageView; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.Gallery.LayoutParams; import android.widget.ViewSwitcher.ViewFactory; public class testImageView extends Activity implements ViewFactory { private ImageSwitcher is; private Gallery gallery; private int downX,upX; private ArrayList<Integer> imgList=new ArrayList<Integer>();//图像ID @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.main); //用反射机制来获取资源中的图片ID Field[] fields = R.drawable.class.getDeclaredFields(); for (Field field : fields) { if (!"icon".equals(field.getName()))//除了icon之外的图片 { int index = 0; try { index = field.getInt(R.drawable.class); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } //保存图片ID imgList.add(index); } } //设置ImageSwitcher控件 is = (ImageSwitcher) findViewById(R.id.switcher); is.setFactory(this); is.setInAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_in)); is.setOutAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_out)); is.setOnTouchListener(new OnTouchListener(){ /* * 在ImageSwitcher控件上滑动可以切换图片 */ @Override public boolean onTouch(View v, MotionEvent event) { if(event.getAction()==MotionEvent.ACTION_DOWN) { downX=(int) event.getX();//取得按下时的坐标 return true; } else if(event.getAction()==MotionEvent.ACTION_UP) { upX=(int) event.getX();//取得松开时的坐标 int index=0; if(upX-downX>100)//从左拖到右,即看前一张 { //如果是第一,则去到尾部 if(gallery.getSelectedItemPosition()==0) index=gallery.getCount()-1; else index=gallery.getSelectedItemPosition()-1; } else if(downX-upX>100)//从右拖到左,即看后一张 { //如果是最后,则去到第一 if(gallery.getSelectedItemPosition()==(gallery.getCount()-1)) index=0; else index=gallery.getSelectedItemPosition()+1; } //改变gallery图片所选,自动触发ImageSwitcher的setOnItemSelectedListener gallery.setSelection(index, true); return true; } return false; } }); //设置gallery控件 gallery = (Gallery) findViewById(R.id.gallery); gallery.setAdapter(new ImageAdapter(this)); gallery.setOnItemSelectedListener(new OnItemSelectedListener(){ @Override public void onItemSelected(AdapterView<?> arg0, View arg1, int position, long arg3) { is.setImageResource(imgList.get(position)); } @Override public void onNothingSelected(AdapterView<?> arg0) { // TODO Auto-generated method stub } }); } //设置ImgaeSwitcher @Override public View makeView() { ImageView i = new ImageView(this); i.setBackgroundColor(0xFF000000); i.setScaleType(ImageView.ScaleType.CENTER);//居中 i.setLayoutParams(new ImageSwitcher.LayoutParams(//自适应图片大小 LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); return i; } public class ImageAdapter extends BaseAdapter { public ImageAdapter(Context c) { mContext = c; } public int getCount() { return imgList.size(); } public Object getItem(int position) { return position; } public long getItemId(int position) { return position; } public View getView(int position, View convertView, ViewGroup parent) { ImageView i = new ImageView(mContext); i.setImageResource(imgList.get(position)); i.setAdjustViewBounds(true); i.setLayoutParams(new Gallery.LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); return i; } private Context mContext; } }
除了Gallery可以拖拉切换图片,我在ImageSwitcher控件加入了setOnTouchListener事件实现,使得ImageSwitcher也可以在拖拉中切换图片。本例子依然使用JAVA的反射机制来自动读取资源中的图片。
main.xml的源码如下:
- <?xmlversion="1.0"encoding="utf-8"?>
- <RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
- <ImageSwitcherandroid:id="@+id/switcher"
- android:layout_width="match_parent"android:layout_height="match_parent"/>
- <Galleryandroid:id="@+id/gallery"
- android:background="#55000000"
- android:layout_width="match_parent"
- android:layout_alignParentBottom="true"
- android:layout_alignParentLeft="true"
- android:gravity="center_vertical"
- android:spacing="16dp"android:layout_height="100dp"/>
- </RelativeLayout>
程序的源码如下:
- packagecom.testImageView;
- importjava.lang.reflect.Field;
- importjava.util.ArrayList;
- importandroid.app.Activity;
- importandroid.content.Context;
- importandroid.os.Bundle;
- importandroid.view.MotionEvent;
- importandroid.view.View;
- importandroid.view.View.OnTouchListener;
- importandroid.view.ViewGroup;
- importandroid.view.animation.AnimationUtils;
- importandroid.widget.AdapterView;
- importandroid.widget.BaseAdapter;
- importandroid.widget.Gallery;
- importandroid.widget.ImageSwitcher;
- importandroid.widget.ImageView;
- importandroid.widget.AdapterView.OnItemSelectedListener;
- importandroid.widget.Gallery.LayoutParams;
- importandroid.widget.ViewSwitcher.ViewFactory;
- publicclasstestImageViewextendsActivityimplementsViewFactory{
- privateImageSwitcheris;
- privateGallerygallery;
- privateintdownX,upX;
- privateArrayList<Integer>imgList=newArrayList<Integer>();//图像ID
- @Override
- protectedvoidonCreate(BundlesavedInstanceState){
- //TODOAuto-generatedmethodstub
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- //用反射机制来获取资源中的图片ID
- Field[]fields=R.drawable.class.getDeclaredFields();
- for(Fieldfield:fields)
- {
- if(!"icon".equals(field.getName()))//除了icon之外的图片
- {
- intindex=0;
- try{
- index=field.getInt(R.drawable.class);
- }catch(IllegalArgumentExceptione){
- //TODOAuto-generatedcatchblock
- e.printStackTrace();
- }catch(IllegalAccessExceptione){
- //TODOAuto-generatedcatchblock
- e.printStackTrace();
- }
- //保存图片ID
- imgList.add(index);
- }
- }
- //设置ImageSwitcher控件
- is=(ImageSwitcher)findViewById(R.id.switcher);
- is.setFactory(this);
- is.setInAnimation(AnimationUtils.loadAnimation(this,
- android.R.anim.fade_in));
- is.setOutAnimation(AnimationUtils.loadAnimation(this,
- android.R.anim.fade_out));
- is.setOnTouchListener(newOnTouchListener(){
- /*
- *在ImageSwitcher控件上滑动可以切换图片
- */
- @Override
- publicbooleanonTouch(Viewv,MotionEventevent){
- if(event.getAction()==MotionEvent.ACTION_DOWN)
- {
- downX=(int)event.getX();//取得按下时的坐标
- returntrue;
- }
- elseif(event.getAction()==MotionEvent.ACTION_UP)
- {
- upX=(int)event.getX();//取得松开时的坐标
- intindex=0;
- if(upX-downX>100)//从左拖到右,即看前一张
- {
- //如果是第一,则去到尾部
- if(gallery.getSelectedItemPosition()==0)
- index=gallery.getCount()-1;
- else
- index=gallery.getSelectedItemPosition()-1;
- }
- elseif(downX-upX>100)//从右拖到左,即看后一张
- {
- //如果是最后,则去到第一
- if(gallery.getSelectedItemPosition()==(gallery.getCount()-1))
- index=0;
- else
- index=gallery.getSelectedItemPosition()+1;
- }
- //改变gallery图片所选,自动触发ImageSwitcher的setOnItemSelectedListener
- gallery.setSelection(index,true);
- returntrue;
- }
- returnfalse;
- }
- });
- //设置gallery控件
- gallery=(Gallery)findViewById(R.id.gallery);
- gallery.setAdapter(newImageAdapter(this));
- gallery.setOnItemSelectedListener(newOnItemSelectedListener(){
- @Override
- publicvoidonItemSelected(AdapterView<?>arg0,Viewarg1,
- intposition,longarg3){
- is.setImageResource(imgList.get(position));
- }
- @Override
- publicvoidonNothingSelected(AdapterView<?>arg0){
- //TODOAuto-generatedmethodstub
- }
- });
- }
- //设置ImgaeSwitcher
- @Override
- publicViewmakeView(){
- ImageViewi=newImageView(this);
- i.setBackgroundColor(0xFF000000);
- i.setScaleType(ImageView.ScaleType.CENTER);//居中
- i.setLayoutParams(newImageSwitcher.LayoutParams(//自适应图片大小
- LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT));
- returni;
- }
- publicclassImageAdapterextendsBaseAdapter{
- publicImageAdapter(Contextc){
- mContext=c;
- }
- publicintgetCount(){
- returnimgList.size();
- }
- publicObjectgetItem(intposition){
- returnposition;
- }
- publiclonggetItemId(intposition){
- returnposition;
- }
- publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
- ImageViewi=newImageView(mContext);
- i.setImageResource(imgList.get(position));
- i.setAdjustViewBounds(true);
- i.setLayoutParams(newGallery.LayoutParams(
- LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
- returni;
- }
- privateContextmContext;
- }
- }