想做个图片浏览功能,需要浏览大量图片,图片切换之间有动画效果,开始时用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);
调用is.setFactory(ViewSwitcher.ViewFactory factory)方法,ViewSwitcher.ViewFactory里有一个方法makeView,返回值为View对象。
@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;
}
如果要切换图片就调用setImageURI(Uri uri)或者setImageResource(int resid)或者setImageDrawable(Drawable drawable)方法。
可以在切换图片时加动画效果,通过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);
}
}
}