要解决"AutoFitTextureView捕获了摄像机预览中不可见的帧"的问题,可以按照以下步骤进行操作:
private Camera.PreviewCallback mPreviewCallback = new Camera.PreviewCallback() {
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
if (isTextureViewVisible()) {
// 将帧传递给AutoFitTextureView进行显示
mTextureView.onPreviewFrame(data, camera);
} else {
// 不可见的帧丢弃
camera.setPreviewCallback(null);
}
}
};
private boolean isTextureViewVisible() {
Rect surfaceFrame = new Rect();
mTextureView.getGlobalVisibleRect(surfaceFrame);
Rect visibleFrame = new Rect();
mVisibleSurfaceView.getGlobalVisibleRect(visibleFrame);
return surfaceFrame.intersect(visibleFrame);
}
在上述代码中,isTextureViewVisible()方法用于判断AutoFitTextureView是否可见。首先,通过getGlobalVisibleRect()方法获取AutoFitTextureView和透明SurfaceView在屏幕上的可见区域。然后使用intersect()方法判断两个区域是否有交集,如果有交集说明AutoFitTextureView可见,否则不可见。
private void openCamera() {
// ...
// 设置预览回调
mCamera.setPreviewCallback(mPreviewCallback);
// 设置预览的Surface
try {
mCamera.setPreviewDisplay(mVisibleSurfaceView.getHolder());
} catch (IOException e) {
e.printStackTrace();
}
// ...
}
private void releaseCamera() {
// ...
mCamera.setPreviewCallback(null);
mCamera.setPreviewDisplay(null);
// ...
}
通过以上步骤,AutoFitTextureView将只捕获可见的帧,不可见的帧将被丢弃,从而解决了"AutoFitTextureView捕获了摄像机预览中不可见的帧"的问题。