现在的位置: 首页 > 综合 > 正文

ImageSwitcher与GestureDetector

2013年08月17日 ⁄ 综合 ⁄ 共 3295字 ⁄ 字号 评论关闭

     想做个图片浏览功能,需要浏览大量图片,图片切换之间有动画效果,开始时用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);
		}
		
	}
}

抱歉!评论已关闭.