您的位置:首页 > 移动开发 > Android开发

Android照片处理——涂鸦和拼图实现

2015-01-07 15:01 162 查看
先看效果图:








技术回顾:这个里面的涂鸦是网上的一个相关帖子,我只修改了里面的涂鸦界面背景,增加了拍照获取和裁剪照片等,主要实现的是拼图,拼图首先要获取系统的相册并展示出来,用BaseAdapter从SD卡中读取相册列表显示出来,当然在这之前得调用MediaStore系统类,使用MediaStore.Images.Media.EXTERNAL_CONTENT_URI取得所有照片的信息,返回照片的路径、大小和最后修改时间以及直接包含图片的文件夹也就是相册名字,把每个相册中的第一张照片设置为展示列表中要显示的。调用BitmapFactory.Options根据指定的图像路径和大小来获取缩略图,这样有两点好处: 1.使用较小的内存空间,第一次获取的bitmap实际上为null,只是为了读取宽度和高度,第二次读取的bitmap是根据比例压缩过的图像,第三次读取的bitmap是所要的缩略图。2、缩略图对于原图像来讲没有拉伸,不会出现失真现象。之后在gridview中显示相册里的缩略图,并创建一个数组imageChose来存放选择好的照片,当选择gridview中的照片时把选中的照片放入,调用notifyDataSetChanged()更新下面已选中照片,当点击下面已选中时就是把imageChose中的相关照片从里面remove掉。也就是说这个数组里面一直保存着当前选中的照片,便于下面拼图操作的传值。

在拼图界面,创建一个400*660大小的画布,在布局文件中设置一个relativelayout布局,目的是把这个画布的view给add进去,便于截图保存。在对应的三四五张照片的时候先计算好每一块所占画布的大小。起初我是把照片按预定的大小来进行createSclaBitmap压缩,但是这个针对正方形不会失真,要是长方形就会失真,解决的办法是把照片先统一压缩为固定尺寸400*400大小的,在裁剪相应大小填进拼图区域里,可是裁剪的部分并不一定是我们想要的,我们要是想移动照片在框里面的位置,不可能!最后把画布按模版样式裁剪为几个部分,这样照片还采用正方形只不过一直按照裁剪区域的最大边来压缩,这样照片不会失真,而且可以移动,当然移动的时候得设置好坐标,在对应的区域相应的图片移动,对其他图片互不影响,在这次裁剪后填充图片时必须调用Canvas类的save()和restore()方法来保存Canvas的状态和恢复他的状态,不然就永远只能绘制一张图。

心得:通过这个拼图的设计,我更进一步体会到Android中的Canvas类和Paint类以及Bitmap类的用法,并且学会了canvas类中的save和restore、clipRect、drawBitmap等相关函数的用法,同时学会了Bitmap中的三种缩放照片的方法,在统统试了一遍之后也知道了他们的区别。同时学会了分享功能和保存照片的写法。而且在界面设计排版中也有了提高,并且对Android中的View和它上面的监听事件有了进一步的掌握,在重绘界面时用了postInvalidate();通过它我还学习了invalidate,明白了后者在UI线程中使用,前者在非UI线程中使用,总之这个项目我收获颇多。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: