【问题标题】:Android custom view save visible screen to bitmapAndroid自定义视图将可见屏幕保存到位图
【发布时间】:2011-12-08 08:20:02
【问题描述】:

在我的应用程序中,用户操作图像、旋转、捏合、缩放等。这是在onDraw()using canvas.translate()canvas.rotate() 等范围内制作的。当然图像很大,并且在用户处理图像之后执行与其他视图的交互。问题是我不想一遍又一遍地重绘整个大图像,只重绘可见部分。所以我想,在用户完成操作后,将屏幕上的当前可见图像保存到内存/位图/缓存并仅重绘。

我怎样才能做到这一点?

【问题讨论】:

    标签: android caching bitmap android-custom-view


    【解决方案1】:

    在自定义视图的构造函数中,启用绘图缓存,如下所示:setDrawingCacheEnabled(true);。然后,每当您想保存 Canvas 的状态时,您都可以调用 getDrawingCache(),它会返回所需的 Bitmap

    文档:getDrawingCache()

    【讨论】:

    • 你在这里有一个答案,但不幸的是,正如我所说,我正在处理图像,如果 buildDrawingCache 比屏幕大,它似乎不应该有我的视图,因为视图的可见部分只被绘制并且缓存只保存绘制的内容....有什么方法可以解决这个问题吗?当我的视图大于屏幕时,我只需要缓存可见屏幕...
    • 你的第一句话对我来说并不完全清楚。在这种情况下,您还可以澄清绘制和可见之间的区别吗?
    • 我读到为了能够缓存视图的内容,视图不能大于屏幕的大小。因此,在 800x480 屏幕上的自定义视图中使用 2000x1000 像素的图像会导致无法缓存视图。我做了一个测试,缓存的位图是空的。还是我错过了什么?
    • 不,我认为你是对的。是不是可以让视图和屏幕一样大,让用户旋转/调整视图的内容,而不是视图本身?如果我错了,请纠正我。
    【解决方案2】:

    在你的绘制中用位图初始化你的画布。 保留此位图的引用并在需要时保存。

    【讨论】:

      【解决方案3】:

      我发现了一篇关于我需要什么的非常棒的文章 HERE

      为了清楚起见,首先我需要创建一个与我的视图大小相同的位图,然后为它创建一个画布,在画布上绘制然后保存它。

      public void saveScreenshot() {
                  Bitmap bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
                  Canvas canvas = new Canvas(bitmap);
                  canvas.draw(myGiganticImage)
      
                  File file = new File(context.getFilesDir() + "/cache.jpg");
                  FileOutputStream fos;
                  try {
                      fos = new FileOutputStream(file);
                      bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fos);
                      fos.close();
      
                      cachedBackground = BitmapFactory.decodeFile(context.getFilesDir()  + "/cache.jpg"
                      invalidate()                
                  } catch (FileNotFoundException e) {
                  } catch (IOException e) {
                  }
              }
      

      当我需要它时,我只是在 onDraw() 上调用它。它会在内存中保存一个位图,我可以用它来绘制,而不是大图。

      【讨论】:

        【解决方案4】:

        以下内容可能对您有所帮助:

        (1)

         View v = view.getRootView();
            v.setDrawingCacheEnabled(true);
            Bitmap b = v.getDrawingCache();
        

        (2) 这与How to capture the android device screen content? 的另一个问题类似

        (3)你可以试试这个库 http://code.google.com/p/android-screenshot-library/ 它引入了一个 Android 屏幕截图库 (ASL),它能够以编程方式从 Android 设备中捕获屏幕截图,而无需具有 root 访问权限。

        【讨论】:

        • (1) 我需要在哪里运行此代码?在我的活动中?如果是这样,它不适合我的需要,因为我需要在绘制其他元素之前在 onDraw 中请求 getDrawingCache()。正如我之前解释的那样,这可能不起作用。 (2) 和 (3) 我不想使用该库,因为它在设备启动时开始提供一些服务。感谢您的帮助。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-02-03
        • 2013-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多