博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android界面中包含ListView的屏幕截图问题记录
阅读量:6179 次
发布时间:2019-06-21

本文共 3395 字,大约阅读时间需要 11 分钟。

  hot3.png

界面的布局情况:

    
    
    
    
        
    

功能要求:实现全屏幕的截图功能,包括ListView中滑动出现的内容。

实现思路:由于ListView容器为了能加载大数量的Item,内部已经实现了对不可视资源的回收机制(详细可以参考: ),如果直接调用getChild的方式,会导致不可见的部分无法获取;因此,只能通过ListAdapter的getView来获取,然后调用每个item view的绘制过程,生成相关的图片,然后再拼起来,大概实现思路就是这样。

这里首先要解决的一个问题是:如何把View转化成图片?

我在这里参考了这篇文章:

我使用了第二种方案有效,其思路也就是View的绘制流程 measure -> layout -> draw。

ListView 的Item布局:

    
    
        
    

我们想要的是:

214249_lsw0_107980.png

但是可能会变成:

214249_3mNA_107980.png

原因大概是由于调用getView返回的View一般都是通过View.inflate得到的,因此在measure的过程中没有上一层父容器的尺寸参考,所以在传入measure参数为:

view.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));

的时候,就会只能刚好装下里面的View,因此看起来变短了。

我们可以这样子修改,指定View的宽度或者高度,在这里,我需要指定它的宽度(width是屏幕宽度):

view.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));

好了,ListView的截图代码看起来大概就像这样子:

public  static Bitmap  createBitmap(ListView listView){    int titleHeight,width, height, rootHeight=0;    Bitmap bitmap;    Canvas canvas;    int yPos;    int listItemNum;    List
 childViews = null;            width = getScreenWidth();//宽度等于屏幕宽        ListAdapter listAdapter = listView.getAdapter();    listItemNum = listAdapter.getCount()>    childViews = new ArrayList
(listItemNum);    View itemView;    //计算整体高度:    for(int pos=0; pos < listItemNum; ++pos){        itemView = listAdapter.getView(pos, null, rootView);        //measure过程        itemView.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));        childViews.add(itemView);        rootHeight += itemView.getMeasuredHeight();    }    height = rootHeight;    bitmap = BitmapUtil.createBitmap(width, height, Config.ARGB_8888);    canvas = new Canvas(bitmap);    Bitmap itemBitmap;    View itemView;    int childHeight;    //把每个ItemView生成图片,并画到背景画布上    for(int pos=0; pos < childViews.size(); ++pos){        itemView = childViews.get(pos);        childHeight = itemView.getMeasuredHeight();        itemBitmap = viewToBitmap(itemView,width,childHeight);        if(itemBitmap!=null){            canvas.drawBitmap(itemBitmap, 0, yPos, null);        }        yPos = childHeight +yPos;    }        canvas.save(Canvas.ALL_SAVE_FLAG);    canvas.restore();    return bitmap;}private static Bitmap viewToBitmap(View view,int viewWidth, int viewHeight){        view.layout(0, 0, viewWidth, viewHeight);        view.buildDrawingCache();        Bitmap bitmap = view.getDrawingCache();        return bitmap;}

到这里就完了么?可能还没有。。。笔者就碰到了这种情况:Item的部分内容没有画出来...

正确:

221734_Ys5u_107980.png

错误:

221733_XoQO_107980.png

既然有的出来了,有的没出来,羊毛肯定就出在羊身上了...

具体原因我也暂时没有分析,把代码贴出来给大家做参考吧:

正确布局代码:

    
    
        
        
        
        
        
            
            
                
            
            
            

失败的布局代码:

    
    
        
        
        
        
        
            
            
                
            
            
            

最后分享一张成功截图全貌:

222212_ID4v_107980.jpg

原文:

转载于:https://my.oschina.net/daxia/blog/330298

你可能感兴趣的文章
URL编码
查看>>
光模块及光纤知识(含分类,常用类型介绍)
查看>>
Apache 单IP多端口设置
查看>>
安装系统前的准备---vmware
查看>>
Tiny并行计算框架之使用介绍
查看>>
Linux od命令
查看>>
一个不错的MySQL集群管理工具
查看>>
mysql-proxy 按表分发查询的lua脚本
查看>>
在wordpress主题下面添加二级菜单
查看>>
CentOS 下JDK安装
查看>>
Nginx + Django
查看>>
我的友情链接
查看>>
用shell脚本编写进度条
查看>>
使用Live555类库实现的网络直播系统
查看>>
IO与NIO
查看>>
go_wed编程笔记
查看>>
iptables防火墙的使用
查看>>
浅谈js中的继承
查看>>
软件工程 之 画扇面
查看>>
zabbix mysql数据库迁移方案
查看>>