LongScreenshot代码流程概述
2016-11-30 17:57
260 查看
首先静态注册ScreenShotReceiver,通过这个receiver启动ScreenShotService,在ScreenshotService中动态注册上图中3个Receiver。
先通过在ScreenShotService中初始化窗口,为View添加监听器。事件的处理就从监听器入手。主要是滚动和保存单个截屏,最后拼接成一个长截屏图片。
保存单个截屏和计算滚动的一些参数的工作主要由NextScreenThread子线程去完成,滚动由NextScreenThread发消息给mUpdateScreenHanler在主线程中完成。
而最终保存长截图的工作有SavePictureThread子线程负责,其中就包括完成所有截屏的拼接工作。
停止screenshot:stopSelfBySelf();
判断是否到底了:isScrollToBottom();
mHandler中处理按下nextScreen后的三种消息:
1.MESSAGE_SHOW_DRAG_UP_VIEW---滚屏完后,显示出边框和bottomview
2.MESSAGE_DISABLE_NEXT_SCREEN---滚动后发现没有下一屏了。
3.MESSAGE_CAPTURE_SCREEN) ---scrollScreen()执行完了,即滚完屏幕了
点击nextScreen的处理流程:
1.判断是否需要滚动,需要就执行第2步。不需要就不执行第2步。
2.若是需要滚动,则先然所有外加边框和按钮都隐藏了。
(前面两步都是preNextScreen()做的,下面的步骤在NextScreenTread中完成)
3.在滚动前,先使用captrueScreen()截取图片。
4.发消息mUpdateScreenHanler.sendMessage(m1);滑动下一屏。在handleMessager中调用scrollScreen();
在scrollScreen()滚动完后,sendMyMessage(mHandler, MESSAGE_CAPTURE_SCREEN);mHandler的处理是,获取滚动完的图片(这时候
那些外边框没显示出来),对比前后图片有没有相同,如果不相同就证明不是底部。则把图片保存起来。如果是底部了,则不保存这个图片,会保存
点击save后的那个图片,因为如果是底部,会弹出toast,则此时获取到的图片会包含toast。所以点击save后触发preSavePicture()是为了隐藏外边框和按钮,
触发SavePictureThread是保存图片,根据是否滑到底部来处理。
保存图片是使用了StorageHelper。一般都是如果有插入sd卡,就优先存放在sd卡,但是基于Service实现的apk是申请不了SD卡的读写权限的。所以isSDCardInserted()一直
返回false;
相关文章推荐
- Windows phone screenshot 截图 代码
- rails启动过程(一)代码流程概述
- 体绘制(Volume Rendering)概述之4:光线投射算法(Ray Casting)实现流程和代码(基于CPU的实现)
- JAVA概述(9) 循环语句(流程控制)(代码实践2)
- volume down + power key ScreenShot 流程
- 录屏代码流程概述
- google浏览器截图工具 Open Screenshot(代码截图)
- 体绘制(Volume Rendering)概述之4:光线投射算法(Ray Casting)实现流程和代码(基于CPU的实现)
- 体绘制(Volume Rendering)概述之4:光线投射算法(Ray Casting)实现流程和代码(基于CPU的实现)
- Peercast核心代码执行流程
- Beginning C# Objects从概念到代码——1.11 循环和其他控制结构流程(一)
- 系统初始化流程 跟着启动代码走 !
- SOA 术语概述,第 2 部分: 开发流程、模型和资产
- UIQ3上拷屏软件FastScreenshot
- 网站项目建设流程概述
- 生产过程代码分析(一)--概述
- Eboot代码流程
- 网站项目建设流程概述
- SOA 术语概述,第 2 部分: 开发流程、模型和资产
- J2EE 学习流程概述