从技术上看待长截屏,如何实现这一功能?

  • 回答 (10)
  • 关注 (0)
  • 查看 (313)

目前智能手机基本上都有长截屏功能,那么从技术上如何实现这一功能?

叮当叮当叮当叮当提问于
大数据弄潮儿创业者回答于

点击“长截屏”按钮之后,大概会发生下面的事情:

  1. 找到当前前台Activity,然后通过上面说的远程调用,调用过去。
  2. 在前台Activity里执行的代码收到调用后,找到用户要滚动的View,并滚动一定距离。然后停止滚动并通过Broadcast通知截屏窗口,包括View的位置及滚动的距离信息。
  3. 截屏窗口截取一张屏幕,当然,不包含自己这个窗口,只截Activity。然后根据传递过来的信息决定怎么裁剪,怎么拼接。
  4. 截屏窗口截屏之后告诉前台Activity已经截完屏了,可以继续滚动了。
  5. 注意,进行前面这些步骤的时候由于截屏app的窗口挡在上面,我们是完全看不到的。当滚动了一屏后的截屏内容得到后,那么我们已经有了不止当前屏幕的内容,还有了下一屏的内容,于是我们在界面上从原本的一张静态截屏图片,无缝的切换成由多张截屏拼接成的图片,然后开始做滚动动画(我自己感觉有种魔法般的感觉)。所以我们看到的内容滚动是滞后于真正的“截屏”动作的。
  6. 如此循环,直到点击了“结束”或到底。
社会人就是请不要忘记微笑!回答于

1、通过遍历Activity主窗口的View树,来找到可以滚动的ViewGroup,并存储它的四个布局参数。

2、再次遍历Activity的所有窗口的View树,然后对比布局参数找到位于滚动ViewGroup之上的View,并设置它们为INVISIBLE。

3、检查该应用的Service是否有可见窗口,如果有同样设置为INVISIBLE。

4、获取用户截屏长度,滚动ViewGroup,截图,裁剪,拼凑,回显给长截屏操作窗口。

5、当截最后一张屏时,将设置过INVISIBLE的View,全部恢复,然后裁剪,拼凑,得到最终的长截屏。

红鳄鱼VIP回答于

把主Window以外的Window都removeView可以减少遮挡,但是主Window上仍然可能存在其它View遮挡住滚动View。如果用Wm,和隐藏Service中的Views是一个意思。

网偶回答于

其实可以只用常数内存进行拼接的。

楼主石乐志崇文尚武推理极工回答于
风雨交加不会踢球的营销狗不是好厨子回答于

我发现了有长度限制…不过除非是特别长的,也就多截一两次。

Rexsen程序猿回答于

图片直接编辑就可以解决啦,不过也有点麻烦π_π

不吃貓的鱼oo回答于

有长度限制,大概是限制为屏幕高度的10倍吧。因为屏幕拼接在内存里进行,担心内存溢出,所以做了限制。

HXD3C0134风险控制;公司往云上走回答于

每次移动四分之三的屏幕距离

比较相邻两次结果

Universe回答于

所属标签

可能回答问题的人

  • 西风

    renzha.net · 站长 (已认证)

    9 粉丝1 提问5 回答
  • uncle_light

    5 粉丝518 提问3 回答
  • 学生

    2 粉丝477 提问3 回答
  • 军哥

    重庆雷驰信息技术有限公司 · 经理 (已认证)

    5 粉丝1 提问3 回答

扫码关注云+社区

领取腾讯云代金券