android 横向长图,Android实现截超长图

近来项目提出个新需求——截取超长屏,令人很是抓耳挠腮。想要实现此功能本人先进行了大致构思:比如需要截取的界面包括头部布局和尾部布局还有一个高度不确定的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

再补充一点,截长图操作一定要放在子线程中进行,不要在主线程中操作这么耗时的操作,等截完图展示时候再回到主线程中调用。实际开发中问题真的是层出不穷,作为勤恳的码农只要不断思考总有解决的办法的,大家一起加油喽。

此篇仅为思路分享和个人笔记,没有附源码,尽请谅解!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用 HorizontalScrollView 和 LinearLayout 实现横向滚动片的效果。具体实现步骤如下: 1. 在布局文件中,使用 HorizontalScrollView 包裹 LinearLayout,并设置 LinearLayout 的 orientation 属性为 horizontal,如下所示: ```xml <HorizontalScrollView android:layout_width="match_parent" android:layout_height="wrap_content"> <LinearLayout android:id="@+id/ll_horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal"> <!-- 在这里添加片 --> </LinearLayout> </HorizontalScrollView> ``` 2. 在代码中,获取 LinearLayout 并动态添加片,如下所示: ```java LinearLayout llHorizontal = findViewById(R.id.ll_horizontal); for (int i = 0; i < imageList.size(); i++) { ImageView imageView = new ImageView(this); imageView.setImageResource(imageList.get(i)); imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( getResources().getDimensionPixelSize(R.dimen.image_width), getResources().getDimensionPixelSize(R.dimen.image_height)); layoutParams.setMargins(0, 0, getResources().getDimensionPixelSize(R.dimen.image_margin), 0); imageView.setLayoutParams(layoutParams); llHorizontal.addView(imageView); } ``` 其中,imageList 是存放片资源 ID 的列表,R.dimen.image_width、R.dimen.image_height 和 R.dimen.image_margin 是在 dimens.xml 文件中定义的片宽度、高度和间距。 这样就可以实现横向滚动片的效果了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值