您的位置:首页 > 编程语言

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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: