【问题标题】:Capture ViewGroup into an Image File将 ViewGroup 捕获到图像文件中
【发布时间】:2012-05-17 22:49:31
【问题描述】:

我有一个ImageView 和两个TextViews 的简单组合。我想让TextViewsImageView重叠,然后将组合保存为一个整体(例如PNG)。

我知道我可以使用FrameLayoutTextViews 叠加在ImageView 上,我已经在这样做了。现在我想知道的是,如何将其导出到图像中?

我阅读了有关使用 Canvas 的各种帖子。有没有办法将FrameLayout 导出为PNG 图像,或者我需要创建一个画布,添加ImageViewTextViews,然后将画布本身导出为PNG?

提前谢谢你。

【问题讨论】:

    标签: java android android-layout screen-capture


    【解决方案1】:

    可以轻松完成吗?,是的

    怎么做?

    好吧,前几天我碰巧为此做了一个函数,它真的很简单(确保你有写入外部设备的权限)。您所要做的就是指定要“绘制”到Bitmap 的视图(它也将包括所有子视图),然后您可以像您说的那样将其保存为文件,或者在您的应用程序中的某个位置使用它。

    public void captureView(int viewId,String filename){
        //Find the view we are after
        View    view = (View) findViewById(viewId);
        //Create a Bitmap with the same dimensions 
        Bitmap image = Bitmap.createBitmap(view.getWidth(), 
                                           view.getHeight(), 
                                           Bitmap.Config.RGB_565);
        //Draw the view inside the Bitmap
        view.draw(new Canvas(image)); 
    
        //Store to sdcard
        try {
           String path = Environment.getExternalStorageDirectory().toString();
           File myFile = new File(path,filename);
           FileOutputStream out = new FileOutputStream(myFile);
    
           image.compress(Bitmap.CompressFormat.PNG, 90, out); //Output
        } catch (Exception e) {
           e.printStackTrace();
        }
    }
    

    注意事项 避免尝试在 onCreate 方法上执行此代码,因为您可能会在绘制视图之前尝试获取视图的宽度和高度,因此会导致一个错误,因为位图的尺寸可能为 0。

    它是按原样还是按创建时捕获视图?

    一开始我并不确定,但经过一些测试后,您所见即所得,因此,如果您有旋转的东西或与发布时的原始配置不同,它会在捕获中反映这一点。这可能是也可能不是您所追求的,但这就是它所提供的。这是捕获的LinearLayout 示例(没有截图或裁剪,只是直接来自设备)。

    【讨论】:

    • 谢谢,这看起来很棒!我应该在单个 TextViews/ImageView 上调用它,还是在 Layout 本身上调用它?
    • 布局都扩展了 ViewGroup,同时扩展了 View。所以你可以传递任何扩展我假设的视图的东西。与LinearLayouts 一起使用,您可以捕获整个屏幕或部分屏幕。希望它有所帮助,+1 并接受它是否有用;)
    • 是的,当然。给我 10-15 分钟的测试时间,我会马上回来
    • 适用于完整布局,即(在我的示例中)LinearLayout,内部有亲戚,以及各种小部件
    • 这个100分,效果很好,甚至不需要太多改变
    猜你喜欢
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-31
    • 2013-01-13
    相关资源
    最近更新 更多