近来项目提出个新需求——截取超长屏,令人很是抓耳挠腮。想要实现此功能本人先进行了大致构思:比如需要截取的界面包括头部布局和尾部布局还有一个高度不确定的ListView
1.首先思路肯定是把每一块的小View布局分别截取下来缓存成Bitmap(头部、尾部、ListView每个item);
2.接着把截取的每个Bitmap按顺序拼接起来形成一个新的Bitmap,这样就是大致的一个截取思路;
但是思路仅仅是思路,实现起来还是有很多问题的,接下来给读者们出点小问题来考考大家:
1.截取的头部需要进行圆角处理(项目需要这样实现LZ也没办法)
2.截到图在查看的时候左右会有留白(边)(也是项目需要,读者不在意的可以忽略,但是提醒一下有留白真的是丑——个人感觉)
3.Android机型千奇百怪各个手机内存、CPU等也不尽相同,所以就会出现在截长图时候手机需要频繁使用内存来进行截图、拼图、还需要对截下图进行缓存等等,手机就需要频繁GC,在手机内存小、RAM小的情况下就会出现OOM
暂时先提这几个问题,之后有了新的问题再补充哈。不知道大家有没有更好的办法来解决这些问题,如果有请私信我大家一起探讨一下,我先分享下我的大致思路:
第一个问题我得办法就是在截取每个小图之后还没有进行拼接的时候就把头部Bitmap进行圆角化处理,之后再进行拼接;
第二个问题我是在每个图拼到一起时候,此时不是生成了一张Bitmap,然后在这个图的下面在套一张底图,而且这张图要是生成的图的宽高比的1.02(这只是个约数具体看需求要左右留白需要多少)
第三个问题相信所以程序员都遇到过,谁还没有OOM过,谁的代码还没有bug,没有崩溃过,如果你说你的就是没有,那么请伸出长满腿毛的大腿让我膜拜一下(画面好唯美不敢想象了),说实话所有项目都是要上线的,线上是绝对不允许奔溃的。虽说我们程序猿对代码、内存、布局等等进行了优化,但是对于各个手机不同,内存小的手机就是承受不住我们代码的摧残发生奔溃这是谁都不想看到了,既然发生了就要解决。咳咳~~~言归正传,
我的方法很粗暴,请大佬原谅,直接try...catch...把异常抛出,对于这个需求里面有IO、有OOM等等多个异常需要抛出,所以这个一个try...catch...还不行,我就是将异常即使try,catch了也继续向上throw,最多弹个提示不会让他奔溃
可以参考:https://blog.csdn.net/w405722907/article/details/76316561?locationNum=8&fps=1
再补充一点,截长图操作一定要放在子线程中进行,不要在主线程中操作这么耗时的操作,等截完图展示时候再回到主线程中调用。实际开发中问题真的是层出不穷,作为勤恳的码农只要不断思考总有解决的办法的,大家一起加油喽。
此篇仅为思路分享和个人笔记,没有附源码,尽请谅解!!!
推荐几篇个人感觉不错的文章:
https://blog.csdn.net/vip99521/article/details/79656450
https://www.jianshu.com/p/0df30968eac1
https://blog.csdn.net/duanyy1990/article/details/72552965#comments
网友评论