Android zxing - 人像摄像头预览/ surfaceview拉伸/扭曲

And*_*oob 17 android portrait stretching surfaceview zxing

我已设法使用此处的答案将相机预览旋转为肖像:http: //code.google.com/p/zxing/issues/detail?id = 178#c46

然而,预览本身是拉伸/扭曲的 - 高度似乎是拉伸以填充框(但可能是宽度对于屏幕太大而且它被压扁以适应)

有没有办法"包装"内容而不是让它拉伸以适应表面视图?

编辑:我通过改变'CameraConfigurationManager'中的'findBestPreviewSizeValue'方法并反转X和Y点(对于下面指针的sean owen!)进行排序,这里是代码:

private static Point findBestPreviewSizeValue(CharSequence previewSizeValueString,
  Point screenResolution) {
int bestX = 0;
int bestY = 0;
int diff = Integer.MAX_VALUE;
for (String previewSize : COMMA_PATTERN.split(previewSizeValueString)) {

  previewSize = previewSize.trim();
  int dimPosition = previewSize.indexOf('x');
  if (dimPosition < 0) {
    Log.w(TAG, "Bad preview-size: " + previewSize);
    continue;
  }

  int newX;
  int newY;
  try {
    newY = Integer.parseInt(previewSize.substring(0, dimPosition));
    newX = Integer.parseInt(previewSize.substring(dimPosition + 1));
    //original:
    //newX = Integer.parseInt(previewSize.substring(0, dimPosition));
    //newY = Integer.parseInt(previewSize.substring(dimPosition + 1));
  } catch (NumberFormatException nfe) {
    Log.w(TAG, "Bad preview-size: " + previewSize);
    continue;
  }

  int newDiff = Math.abs(newX - screenResolution.x) + Math.abs(newY - screenResolution.y);
  if (newDiff == 0) {
    bestX = newY;
    bestY = newX;
    //original:
    //bestX = newX;
    //bestY = newY;
    break;
  } else if (newDiff < diff) {
    bestX = newY;
    bestY = newX;
    //original:
    //bestX = newX;
    //bestY = newY;
    diff = newDiff;
  }

}

if (bestX > 0 && bestY > 0) {
  return new Point(bestX, bestY);
}
return null;
}
Run Code Online (Sandbox Code Playgroud)

Sea*_*wen 6

除了将预览设置为纵向模式之外,您还需要做更多工作才能使其工作.例如,您需要选择适当的预览尺寸,因为它是纵向而非横向.

包装肯定不可取吗?不,你不能让它包裹; SurfaceView如果需要,它总是将整个预览图像投射到拉伸上.我想你可以重新实现很多代码来做一些不同的事情,但这会很难.