3

我正在开发一个使用 SurfaceView 进行显示的相机应用程序。

我可以
使用 getDrawingCache() (在包装 SurfaceView 的布局上)
以及 canvas.drawBitmap(...) 截取 SurfaceView 的屏幕截图(并将其保存为位图)

但是在这两种方式中,位图始终是透明/空白的。

我有 Galaxy S3,我可以看到他们的相机中有这个功能,他们是如何做到的?

谢谢!

4

2 回答 2

2

几个小时后,我得到了一个很好的解决方案。
也许这不是最好的方法,但对我来说已经足够了。

private long start;
private long end;
private long period;

首先在媒体记录器启动后立即获取开始时间:

private void startRecording()
{
   mMediaRecoder.start();
   start = System.currentTimeMillis();
}

然后,当您按下屏幕/按钮进行截图时,保存期间:

private void captureImage()
{
   end = System.currentTimeMillis();
   period = end - start;
}

最后,当您停止录制时,使用句点和媒体检索器获取位图:

private void saveVideo()
{
   MediaMetadataRetriever retriever = new MediaMetadataRetriever();
   //path -> the path to the video
   retriever.setDataSource(path);
   Bitmap bitmap = retriever.getFrameAtTime(period * 1000,MediaMetadataRetriever.OPTION_CLOSEST);
}

希望对你有帮助!

于 2012-10-30T16:54:46.297 回答
0

没有为表面视图维护缓存。这就是您无法获取缓存位图的原因。实际上,当任何视图被渲染并且它的缓存被打开时,视图位图被渲染时,系统不会进行数学计算来绘制以提高视图的渲染效率。

于 2012-10-29T13:04:05.863 回答