【问题标题】:whole viewgroup to bitmap整个视图组到位图
【发布时间】:2013-04-09 06:58:05
【问题描述】:

是否可以从视图组对象中获取完整的位图?

此代码从当前屏幕上的视图组中截取一个“屏幕截图”,但我想要整个视图,以及当前不在屏幕上的视图。

public void export(ViewGroup view){
    view.setDrawingCacheEnabled(true);
    view.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
    Bitmap bitmap = view.getDrawingCache(true);
}

【问题讨论】:

    标签: android android-layout view android-widget


    【解决方案1】:

    这里我使用 ScrollView 将整个视图变为位图 所以在这里你可以使用任何其他视图组来代替滚动视图,比如 linerlayout 等。

        Bitmap map = loadBitmapFromView(getApplicationContext(),scrollView);
                ByteArrayOutputStream bytes = new ByteArrayOutputStream();
                map.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
    
                //you can create a new file name "test.jpg" in sdcard folder.
                File f = new File("/sdcard" +"/" + "mainemailpdf.jpg");
                f.createNewFile();
                //write the bytes in file
                FileOutputStream fo = new FileOutputStream(f);
                fo.write(bytes.toByteArray());
                bArray = bytes.toByteArray();
                // remember close de FileOutput
                fo.close();
    

    而对于 loadBitmapFromView 方法是:

    public static Bitmap loadBitmapFromView(Context context, View v) {
    
            Toast.makeText(context,
                    v.getMeasuredHeight() + "::::::::::::" + v.getMeasuredWidth(),
                    Toast.LENGTH_LONG).show();
            if (v.getMeasuredHeight() > 0) {
    
                v.measure(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    
                Bitmap b = Bitmap.createBitmap(v.getWidth(), v.getHeight(),
                        Bitmap.Config.ARGB_8888);
    
                Canvas c = new Canvas(b);
    
                v.layout(0, 0, v.getWidth(), v.getWidth());
    
                v.draw(c);
    
                return b;
    
            }
    
            return null;
    
        }
    

    希望对你有帮助:)

    如有任何疑问,请告诉我。

    【讨论】:

    • 感谢您的回答!它可以部分解决我的问题。我可以在自定义视图中编写一个 onMeasure 以便我可以设置布局参数。但是用户可以拖动视图(平移),然后视图并不总是在图像上。
    • 这里我们在 Viewgroup 右侧添加视图。因此即使用户将视图拖到主视图组上的所有视图,我们也可以获得主视图组的位图。如果您有任何困惑,请发送示例代码,我会为您做。
    【解决方案2】:

    这是不可能的,因为 Android 系统会缩小位图。 例如 - 如果您的位图大小为 480*800,则其大小为 480*800*4 = 1536000。 与 4 相乘是因为每个像素是 4 个字节 - RGBA。

    对于每张未缩放的图像,意味着超过一兆半。如果 Android 不会缩小图像,你可能会得到 几次图像加载后出现 OutOfMemoryException。 作为 你有 3 个选择:

    1) view.draw(canvas) 你会得到图像的可见部分(只有实际被绘制到屏幕上的部分)

    2) getDrawingCache() - 会给你缩小的图像。

    3) 创建自定义视图,将位图保存到磁盘并在请求时从那里加载

    【讨论】:

      猜你喜欢
      • 2018-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多