照片按时间分组的实现分析
这个版本新加了这样一个功能:照片按照时间进行分组排列
,要实现这个功能,则需要让RecyclerView
有两个ViewType
,下面就来记录下同事实现的思路:
- 在
adapter
类里重写getItemViewType
方法,并用isParent
方法判断类型,返回两个不同的类型:ITEM_VIEW_TYPE_PARENT
和ITEM_VIEW_TYPE_CHILD
- 在
onCreateViewHolder
方法里,判断viewType
,绘制不同xml里的view,然后返回不同的ViewHolder
- 在
onBindViewHolder
方法里,根据ViewHolder
不同,执行不同的代码逻辑 ItemViewType
是通过对SecureAlbum
model用setAdapterType
方法进行设置,然后根据不同位置,设置不同的ItemViewType
,以便adapter
可以根据不同类型生成不同的view
拍照后照片截取部分进行保存
这个版本中,因为上下部分由原来的半透明变成不透明,所以需求是:拍照保存的图片大小是用户可见范围
,刚开始的思路是:CameraPreview
不全屏放置,这样最终效果会将拍照后的照片进行了’拉长’,因为预览的图片被压缩,而拍出来的照片是正常进行保存,但是给用户的感觉是被’拉长了’。而如果想要正常显示,则需要对CameraPreview
的PreviewSize
进行重新计算,这样是对相机本身的显示比例进行调整,比较复杂。后来想到的方案是:
对于拍照后的图片进行裁剪处理
,这里要特别注意的是:由于照片原始尺寸与屏幕尺寸不一致的,所以要对屏幕上需要裁剪的部分根据照片原始尺寸与屏幕尺寸比例进行换算,才是需要裁剪掉的真实大小
- 然后是对照片进行裁剪(如果有需要同时进行
翻转、镜像保存
),这里使用了BitmapRegionDecoder
这个类的decodeRegion
方法,传入参数Rect
和BitmapFactory.Options
,下面是具体代码实现:
|
|
|
|
Tips
如果应用里面有全屏和非全屏的界面,则全屏跳转到非全屏之前就要将statusbar
重新显示,否则在非全屏页面绘制结束后,调用显示statusbar
代码时会重新进行measure
和绘制操作,结果就是在5.0以上系统RealTimePhotoActivity
里显示的图片会出现向下移动,这就是页面在重新measure
后进行绘制的表现。