想做个图片浏览功能,需要浏览大量图片,图片切换之间有动画效果,开始时用ViewPager实现了,,发现如果图片太多会导致内存不足(后来在官网上发现了解决办法),于是尝试边切换画面边准备View并释放掉bitMap,最后发现切换时画面有点不流畅,于是想到了ViewSwitcher,不过这个控件不自带划屏效果,所以需要自己加上去。
ImageSwitche继承自ViewSwitcherr:
布局文件:
<ImageSwitcher android:layout_height="fill_parent" android:layout_width="fill_parent" android:id="@+id/is"> </ImageSwitcher>java对象获得:
ImageSwitcher is = (ImageSwitcher)findViewById(R.id.is);
@Override public View makeView() { ImageView image =new ImageView(this); image.setLayoutParams(new ImageSwitcher.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); image.setScaleType(ImageView.ScaleType.FIT_XY); return image; }
可以在切换图片时加动画效果,通过setInAnimation方法与setOutAnimation方法。
ViewSwitcher与ImageSwitcher基本差不多,不过一个是只显示ImageView,而另一个不只是显示ImageView。
官方文档上说:这个控件有两个View,并且只能有两个,除了可以通过ViewFactory创建,还可以通过addView(View child, int index, ViewGroup.LayoutParams params)方法自己手动加上去。
GestureDetector:
这个类主要用来处理MotionEvent对象,使触屏后可以简单的判段做了什么操作。
这个类有5种构造方法,我用了GestureDetector(Context context, GestureDetector.OnGestureListener listener)这种。
第二个参数是对触屏的监听接口,一般使用其实现类SimpleOnGestureListener对象。使用者继承SimpleOnGestureListener,想实现什么就重写什么。
在此我重写了onFling方法,这个方法主要判断划屏的。
简单的代码,可能有些考虑不周,没测试,没加动画效果,默认图片存在data/data/<包名>/files/目录下:
import java.io.File; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.net.Uri; import android.os.Bundle; import android.view.GestureDetector; import android.view.GestureDetector.SimpleOnGestureListener; import android.view.MotionEvent; import android.view.View; import android.widget.ImageSwitcher; import android.widget.ImageView; import android.widget.Gallery.LayoutParams; import android.widget.ViewSwitcher.ViewFactory; public class SeePhoto extends Activity implements ViewFactory{ private ImageSwitcher is; private int position; private List<File>files; private GestureDetector gd; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.seephoto); files = getFiles(); is = (ImageSwitcher)findViewById(R.id.is); is.setFactory(this); gd=new GestureDetector(this,new MyGuestListner()); if(files.size()!=0) is.setImageURI(Uri.fromFile(files.get(position))); position=position+1; } private List<File> getFiles() { // TODO Auto-generated method stub List<File>list = new ArrayList<File>(); String names[] = fileList(); for(int i=0;i<names.length;i++){ list.add(getFileStreamPath(names[i])); } return list; } @Override public View makeView() { ImageView image =new ImageView(this); image.setLayoutParams(new ImageSwitcher.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); image.setScaleType(ImageView.ScaleType.FIT_XY); return image; } @Override public boolean onTouchEvent(MotionEvent event) { // TODO Auto-generated method stub return gd.onTouchEvent(event); } class MyGuestListner extends SimpleOnGestureListener{ @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { if(files.size()!=0) if(velocityX>0&&position>0){ is.setImageURI(Uri.fromFile(files.get(position))); position =position-1; }else if(velocityX<0&&position!=files.size()-1){ is.setImageURI(Uri.fromFile(files.get(position))); position=position+1; } return super.onFling(e1, e2, velocityX, velocityY); } } }