加载SD卡图片到Gallery与ImageSwitch使用详解
由于最近小马要使用下Gallery与ImageSwitch实现照片的预览功能,特此找个时间写了个小DEMO测试了下,完整的哦,直接开始,今天好激动呢,吼吼,先分段讲下,最后贴出源代码,看代码之前先往你的模拟器“/sdcard/”下PUSH几张图片哦,作为工程中使用的图片资源,看代码: packagecom.xiaoma.www; importandroid.app.Activity; importandroid.os.Bundle; importjava.io.File; importjava.util.ArrayList; importjava.util.List; importandroid.app.Activity; importandroid.content.Context; importandroid.content.res.Resources; importandroid.content.res.TypedArray; importandroid.graphics.Bitmap; importandroid.graphics.BitmapFactory; importandroid.net.Uri; importandroid.os.Bundle; importandroid.util.AttributeSet; importandroid.util.Log; importandroid.view.View; importandroid.view.ViewGroup; importandroid.view.WindowManager; importandroid.view.View.OnClickListener; importandroid.view.animation.Animation; importandroid.view.animation.AnimationUtils; importandroid.widget.AdapterView; importandroid.widget.BaseAdapter; importandroid.widget.Gallery; importandroid.widget.ImageSwitcher; importandroid.widget.ImageView; importandroid.widget.Toast; importandroid.widget.ViewSwitcher; importandroid.widget.AdapterView.OnItemClickListener; importandroid.widget.Gallery.LayoutParams; /** *@Title:GalleryAddSDPhotoActivity.java *@Packagecom.xiaoma.www *@Description:Gallery与ImageSwitch测试 *@authorMZH *@versionV2.2 */ publicclassGalleryAddSDPhotoActivityextendsActivityimplements AdapterView.OnItemSelectedListener,ViewSwitcher.ViewFactory{ privateList<String>ImageList; privateString[]list; privateImageSwitchermSwitcher; publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); //去掉状态栏,全屏显示 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.main); /** *取得SD卡上的图片文件,并将图片完整路径保存到ImageList中,是完整路径哦 */ ImageList=getInSDPhoto(); /** *将取得的路径集合ImageList转换成数组并存入list中 *List集合中的toArray()方法经常用在集合与数组转换的,吼吼 */ list=ImageList.toArray(newString[ImageList.size()]); //设定Switcher mSwitcher=(ImageSwitcher)findViewById(R.id.switcher); mSwitcher.setFactory(this); /** *设定载入Switcher的模式 *AnimationUtils此类小马我不知道是干吗的,查了源码,用工具,大致意思如果下: *Definescommonutilitiesforworkingwithanimations *即:定义动画通用的工具类,不懂了一个词一个词的查 * *loadAnimation()此方法见名字就知道是什么意思了 *Loadsan{@linkAnimation}objectfromaresource *通过资源文件载入 */ mSwitcher.setInAnimation(AnimationUtils.loadAnimation(this, //下面这个参数小马看了下源码,他们把这个int值转化成了十六进制载入?小马不明白为这样一定要 //转换成十六进制啊?看到小马问题的朋友如果知道话请指点一下,小马先谢过 android.R.anim.fade_in)); /** *设定输出Switcher的模式 */ mSwitcher.setOutAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_out)); mSwitcher.setOnClickListener(newOnClickListener(){ publicvoidonClick(Viewv){ Toast.makeText(GalleryAddSDPhotoActivity.this, "点击了ImageSwitch中的图片", Toast.LENGTH_SHORT).show(); } }); Galleryg=(Gallery)findViewById(R.id.mygallery); /** *添加ImageAdapter并设定给Gallery对象 */ g.setAdapter(newImageAdapter(this,getInSDPhoto())); /** *监听器设置 */ g.setOnItemSelectedListener(this); /*设定一个itemclickListener事件*/ g.setOnItemClickListener(newOnItemClickListener(){ publicvoidonItemClick(AdapterView<?>parent,Viewv, intposition,longid){ Toast.makeText(GalleryAddSDPhotoActivity.this, //注意下小细节,position+1如果不用括号的话,定位就错啦,朋友可以取掉试下 "点击了Gallery画廊中的第"+(position+1)+"张图片", Toast.LENGTH_SHORT).show(); } }); } /** *获取SD卡中图片文件的方法实现 *@return */ privateList<String>getInSDPhoto(){ /** *设定图片所在路径 */ List<String>it=newArrayList<String>(); /** *此处小马直接把图片push进了SD卡根路径下,如果朋友们要放到其它文件下, *可先判断下SD卡存在时将路径指定到自己的路径下就可以了,试试吧,吼吼 */ Filef=newFile("/sdcard/"); File[]files=f.listFiles(); /** *将所有文件存入ArrayList中,这个地方存的还是文件路径哦 */ for(inti=0;i<files.length;i++){ Filefile=files[i]; if(getAllImage(file.getPath())) it.add(file.getPath()); } returnit; } /** *获取所有图片文件的实现 *@paramfName *@return */ privatebooleangetAllImage(StringfName){ booleanre; /*取得扩展名*/ Stringend=fName .substring(fName.lastIndexOf(".")+1,fName.length()) .toLowerCase(); /*按扩展名的类型决定MimeType*/ if(end.equals("jpg")||end.equals("gif")||end.equals("png") ||end.equals("jpeg")||end.equals("bmp")){ re=true; }else{ re=false; } returnre; } /** *改写BaseAdapter自定义一ImageAdapterclass *@Title:ImageAdapter.java *@Packagecom.xiaoma.www *@Description:Gallery适配器实现 *@authorMZH *@versionV2.2 */ //适配器中常用的方法小马就不加注释了 publicclassImageAdapterextendsBaseAdapter{ /*声明变量*/ intmGalleryItemBackground; privateContextmContext; privateList<String>lis; /** *ImageAdapter的构造符 *@paramc *@paramlist */ publicImageAdapter(Contextcontext,List<String>list){ mContext=context; lis=list; /* *使用styleable.xml设置Gallery属性 *下面TypedArray类小马也不知道是什么,眼馋跟进去看了下,贴下源码 */** *Containerforanarrayofvaluesthatwereretrievedwith *{@linkResources.Theme#obtainStyledAttributes(AttributeSet, *int[],int,int)} *or{@linkResources#obtainAttributes}.Be *suretocall{@link#recycle}whendonewiththem. * *Theindicesusedtoretrievevaluesfromthisstructurecorrespondto *thepositionsoftheattributesgiventoobtainStyledAttributes. *看了下,大体意思这句就讲清楚了:Containerforanarrayofvaluesthatwereretrieved *是说:存放从数组中读取出的值(而且这些值可以反复使用的哦)的容器 */ TypedArraya=obtainStyledAttributes(R.styleable.Gallery); mGalleryItemBackground=a.getResourceId( R.styleable.Gallery_android_galleryItemBackground,0); //让对象的styleable属性能够反复使用 //源码中:Besuretocall{@link#recycle}whendonewiththem. a.recycle(); } publicintgetCount(){ returnlis.size(); } publicObjectgetItem(intposition){ returnposition; } publiclonggetItemId(intposition){ returnposition; } /*几定要重写的方法getView,传并几View对象*/ publicViewgetView(intposition,ViewconvertView,ViewGroupparent){ ImageViewi=newImageView(mContext); //使用图片工厂载入并设置图片 Bitmapbm=BitmapFactory.decodeFile(lis.get(position).toString()); i.setImageBitmap(bm); /** *设定ImageView宽高,跟了下FIX_XY,竟然是枚举,好激动,小马好久没看到枚举啦 *试了下ScaleType中除FIT_XY以外的其它选项,效果图分别如果下: */ i.setScaleType(ImageView.ScaleType.FIT_XY); 贴图小马就一次性贴出来,这样容易看出它们之间的差别: FIT_XY效果: FIT_START效果: FIT_END效果: FIT_CENTER效果: CENTER_INSIDE效果: CENTER_CROP效果: CENTER效果: 下面来看下半部分代码: //重新设定Layout的宽高 /** *这个地方小马有个疑问,我设置Gallery全屏的时候画面会拉伸, *有什么办法可以不让他拉伸还可以让它全屏啊?指点下小马,谢谢 *i.setLayoutParams(newGallery.LayoutParams( *WindowManager.LayoutParams.MATCH_PARENT, *WindowManager.LayoutParams.MATCH_PARENT)); */ i.setLayoutParams(newGallery.LayoutParams(136,88)); //设定Gallery背景图 i.setBackgroundResource(mGalleryItemBackground); //传回imageView对象 returni; } } publicvoidonItemSelected(AdapterView<?>parent,Viewview,intposition, longid){ StringphotoURL=list[position]; Log.i("XiaoMa",String.valueOf(position)); mSwitcher.setImageURI(Uri.parse(photoURL)); } publicvoidonNothingSelected(AdapterView<?>parent){ } /** *实现ViewSwitcher.ViewFactory接口必须实现的方法 */ publicViewmakeView(){ ImageViewi=newImageView(this); i.setBackgroundColor(0xFF000000); i.setScaleType(ImageView.ScaleType.FIT_CENTER); i.setLayoutParams(newImageSwitcher.LayoutParams( LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT)); returni; } } 为供朋友们学习交流,如果觉得在这儿看代码不太方便的话,可以下载小马上传的附件,里面是所有代码,在这篇文章中如果看到有地方小马有错误的,请直接批评指正,还有小马在中间提的问题,知情人士请指点下小马,先谢谢啦,吼吼。。O_O 附件:http://down.51cto.com/data/2359572 本文转自华华世界 51CTO博客,原文链接:http://blog.51cto.com/mzh3344258/752580,如需转载请自行联系原作者