Mono for Andrid学习笔记八 如IPhone拖动相片特效Gallery画廊.docx
- 文档编号:3863139
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:13
- 大小:154.80KB
Mono for Andrid学习笔记八 如IPhone拖动相片特效Gallery画廊.docx
《Mono for Andrid学习笔记八 如IPhone拖动相片特效Gallery画廊.docx》由会员分享,可在线阅读,更多相关《Mono for Andrid学习笔记八 如IPhone拖动相片特效Gallery画廊.docx(13页珍藏版)》请在冰豆网上搜索。
MonoforAndrid学习笔记八如IPhone拖动相片特效Gallery画廊
曾经被IPhone用手指在屏幕上滑来滑去拖动图片的操作方式吸引吗?
在Android里,这并不是什么难事,只要用到Gallery即可。
它通常用在设计相册、图片类型的选择器上。
在开始之前,先了解一下什么是Context以及Android.Widget命名空间下的BaseAdapter,在Activity当中,Context就如同是Canvas画布,随时等着被处理或覆盖。
还记得先前介绍Activity之间的传递时,做过Intent以及Context的应用吗?
当中Intent是Android.Content命名空间下的一个类,而Context也是一样。
本范例在Layout里布局一个Gallery对象,再通过BaseAdapter容器存放Gallery所需要的图片。
先将你要显示的图片放到Drawable文件夹下,然后编译一下工程,使其能在代码中使用。
Main.axml的结构很简单,只要放上一个Gallery即可:
+expandsource?
1
2
3
4
5
6
7
8
xmlversion="1.0"encoding="utf-8"?
>
android=" android: orientation="vertical" android: layout_width="fill_parent" android: layout_height="fill_parent" > id="@+id/gallery"android: layout_height="fill_parent"android: layout_width="fill_parent"> 本范例的另一个重点,就是如何设置Gallery图片的宽高以及放置图片Layout的大小,在此我们新建一个ImageAdapter类来继承BaseAdapter容器来存放图片,通过ImageView的SetScaleType方法来改变图片的显示,再通过LayoutParameters属性类改变Layout的宽高。 我们先在Values目录下新建一个attrs.xml文件,这是一个自制Layout元素的用法,在其中定义 +expandsource? 1 2 3 4 5 6 xmlversion="1.0"encoding="utf-8"? > galleryItemBackground"/> ImageAdapter类的结构如下: +expandsource? 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 publicclassImageAdapter: BaseAdapter { privateContextctx; intmGalleryItemBackground; privateint[]images= { Resource.Drawable.btn1, Resource.Drawable.btn1_b, Resource.Drawable.btn2, Resource.Drawable.btn2_b, Resource.Drawable.btn3, Resource.Drawable.btn3_b, Resource.Drawable.btn4, Resource.Drawable.btn4_b }; publicImageAdapter(Contextctx) { try { this.ctx=ctx; Android.Content.Res.TypedArraya=ctx.ObtainStyledAttributes(Resource.Styleable.Gallery); mGalleryItemBackground=a.GetResourceId(Resource.Styleable.Gallery_android_galleryItemBackground,Android.Graphics.Color.Azure); a.Recycle(); } catch(System.Exceptionex) { MessageBox.ShowErrorMessage(ctx,ex); } } publicoverrideintCount { get { returnimages.Length; } } publicoverrideJava.Lang.ObjectGetItem(intposition) { returnposition; } publicoverridelongGetItemId(intposition) { returnposition; } publicoverrideViewGetView(intposition,ViewconvertView,ViewGroupparent) { try { ImageViewv=newImageView(this.ctx); v.SetImageResource(this.images[position]); v.SetScaleType(ImageView.ScaleType.FitXy); v.LayoutParameters=newGallery.LayoutParams(100,50); v.SetBackgroundResource(mGalleryItemBackground); returnv; } catch(System.Exceptionex) { MessageBox.ShowErrorMessage(this.ctx,ex); returnnull; } } } Activity1.cs的代码: +expandsource? 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 [Activity(Label="MonoDroidTest",MainLauncher=true)] publicclassActivity1: Activity { protectedoverridevoidOnCreate(Bundlebundle) { base.OnCreate(bundle); SetContentView(Resource.Layout.Main); try { GallerymGallery=FindViewById mGallery.Adapter=newImageAdapter(this); } catch(System.Exceptionex) { MessageBox.ShowErrorMessage(this,ex); } } } 运行程序,效果如下: 接下来的问题就是,我们能不能读取我们SD卡上的图片,而不是直接把图片作为资源打到包里啊? 这当然是可以的,下面我们把ImageAdapter改写一下,从下面的例子,我们还可以学到如何读取SD卡的文件(记得usingJava.IO;): +expandsource? 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 publicclassImageAdapter: BaseAdapter { privateContextctx; intmGalleryItemBackground; File[]files; intwidth,height; publicImageAdapter(Contextctx) { try { this.ctx=ctx; DisplayMetricsdm=newDisplayMetrics(); ((Activity)this.ctx).WindowManager.DefaultDisplay.GetMetrics(dm); width=dm.WidthPixels; height=dm.HeightPixels; if(Android.OS.Environment.ExternalStorageState.Equals(Android.OS.Environment.MediaMounted)) { Filepath=Android.OS.Environment.ExternalStorageDirectory; Filefile=newFile(path.Path+"/Pictures/Camera"); if(file.Exists()) files=file.ListFiles(); else thrownewSystem.Exception("SD卡中不存在此路径"); } elseif(Android.OS.Environment.ExternalStorageState.Equals(Android.OS.Environment.MediaRemoved)) thrownewSystem.Exception("没有SD卡"); Android.Content.Res.TypedArraya=ctx.ObtainStyledAttributes(Resource.Styleable.Gallery); mGalleryItemBackground=a.GetResourceId(Resource.Styleable.Gallery_android_galleryItemBackground,Android.Graphics.Color.Azure); a.Recycle(); } catch(System.Exceptionex) { MessageBox.ShowErrorMessage(ctx,ex); } } publicoverrideintCount { get { if(files==null) return0; returnthis.files.Length; } } publicoverrideJava.Lang.ObjectGetItem(intposition) { returnposition; } publicoverridelongGetItemId(intposition) { returnposition; } publicoverrideViewGetView(intposition,ViewconvertView,ViewGroupparent) { try { ImageViewv=newImageView(this.ctx); Bitmapbmp=BitmapFactory.DecodeFile(files[position].Path); v.SetImageBitmap(bmp); v.SetScaleType(ImageView.ScaleType.FitXy); v.LayoutParameters=newGallery.LayoutParams(width,height); v.SetBackgroundResource(mGalleryItemBackground); returnv; } catch(System.Exceptionex) { MessageBox.ShowErrorMessage(this.ctx,ex); returnnull; } } } 然后我们在增加一点小功能,就是在点击图片的时候,弹出个小提示,提示你点击的是哪张图片。 这里用到了Toast对象,其实Toast对象我们在第四篇文章介绍布局的时候就已经用过了,但没有具体介绍过它,Toast是Android专属的提示小对象,它的使用方法相当简单,但用途却很广泛。 基本上,Toast就是一个简短的小信息,将要告诉用户的信息以一个浮动在最上层的View显示,显示Toast之后,静待几秒就会自动消失,最常见的应用就是音量大小的调整。 当单击音量调整按钮之后,会看见跳出的音量指示Toast对象,等待调整完之后便会消失。 +expandsource? 1 2 3 4 5 6 GallerymGallery=FindViewById mGallery.Adapter=newImageAdapter(this); mGallery.ItemClick+=(sender,e)=> { Toast.MakeText(this,string.Format("你点击的是{0}号图片",e.Position),ToastLength.Short).Show(); }; 运行后的效果: Toast显示后会在一定时间内消失,在Toast.MakeText方法的第三个参数是一个ToastLength枚举,颗选择Long或Short,前者时间较长,后者较短。 当然,你也可以使用重写Toast对象的方法,自定义Toast显示的Layout,以不同于系统内置的方式显示Toast对象,如要在Toast里显示图片,方式如下: +expandsource? 01 02 03 04 05 06 07 08 09 10 11 GallerymGallery=FindViewById mGallery.Adapter=newImageAdapter(this); mGallery.ItemClick+=(sender,e)=> { Toastt=newToast(this); ImageViewimg=newImageView(this); img.SetImageResource(Android.Resource.Drawable.IcMenuCamera); t.View=img; t.Show(); //Toast.MakeText(this,string.Format("你点击的是{0}号图片",e.Position),ToastLength.Short).Show(); }; 最后说一下BitmapFactory(位于Android.Graphics命名空间下),它是AndroidAPI提供的对象,可以将图片文件转换成Bitmap对象,范例中使用的DecodeFile()方法可以将手机系统中的图片文件转换成为Bitmap对象。 另外,BitmapFactory也提供了其他的方法,如DecodeResource可以将预先存入的图片文件转换成Bitmap对象,DecodeStream方法则可以将InputStream转换成Bitmap对象。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Mono for Andrid学习笔记八 如IPhone拖动相片特效Gallery画廊 Andrid 学习 笔记 IPhone 拖动 相片 特效 Gallery 画廊