- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
这是我用来拍照的预览类:它在许多设备上都能完美运行,但 Android Samsung Galaxy S4 显示的结果很糟糕 => 预览时图像被拉伸(stretch)的问题。
你可以看到下面的图片:
这是我的代码:
class Preview extends ViewGroup implements SurfaceHolder.Callback {
private final String TAG = "Preview";
SurfaceView mSurfaceView;
SurfaceHolder mHolder;
Camera.Size mPreviewSize;
List<Camera.Size> mSupportedPreviewSizes;
Camera mCamera;
Preview(Context context, SurfaceView sv) {
super(context);
mSurfaceView = sv;
mHolder = mSurfaceView.getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
public void setCamera(Camera camera) {
mCamera = camera;
if (mCamera != null) {
mSupportedPreviewSizes = mCamera.getParameters().getSupportedPreviewSizes();
requestLayout();
// get Camera parameters
Camera.Parameters params = mCamera.getParameters();
List<String> focusModes = params.getSupportedFocusModes();
try {
if (focusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)) {
params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
} else if (focusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO)) {
params.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
}
else if (focusModes.contains(Camera.Parameters.FOCUS_MODE_INFINITY)) {
params.setFocusMode(Camera.Parameters.FOCUS_MODE_INFINITY);
}
mCamera.setParameters(params);
}
catch (Exception e) {
}
}
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// We purposely disregard child measurements because act as a
// wrapper to a SurfaceView that centers the camera preview instead
// of stretching it.
final int width = resolveSize(getSuggestedMinimumWidth(), widthMeasureSpec);
final int height = resolveSize(getSuggestedMinimumHeight(), heightMeasureSpec);
setMeasuredDimension(width, height);
if (mSupportedPreviewSizes != null) {
mPreviewSize = getOptimalPreviewSize(mSupportedPreviewSizes, width, height);
}
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
if (changed && getChildCount() > 0) {
final View child = getChildAt(0);
final int width = r - l;
final int height = b - t;
int previewWidth = width;
int previewHeight = height;
if (mPreviewSize != null) {
previewWidth = mPreviewSize.width;
previewHeight = mPreviewSize.height;
}
// Center the child SurfaceView within the parent.
if (width * previewHeight > height * previewWidth) {
final int scaledChildWidth = previewWidth * height / previewHeight;
child.layout((width - scaledChildWidth) / 2, 0,
(width + scaledChildWidth) / 2, height);
} else {
final int scaledChildHeight = previewHeight * width / previewWidth;
child.layout(0, (height - scaledChildHeight) / 2,
width, (height + scaledChildHeight) / 2);
}
}
}
public void surfaceCreated(SurfaceHolder holder) {
// The Surface has been created, acquire the camera and tell it where
// to draw.
try {
if (mCamera != null) {
mCamera.setPreviewDisplay(holder);
}
} catch (IOException exception) {
Log.e(TAG, "IOException caused by setPreviewDisplay()", exception);
}
}
public void surfaceDestroyed(SurfaceHolder holder) {
// Surface will be destroyed when we return, so stop the preview.
if (mCamera != null) {
mCamera.stopPreview();
}
}
private Camera.Size getOptimalPreviewSize(List<Camera.Size> sizes, int w, int h) {
final double ASPECT_TOLERANCE = 0.1;
double targetRatio = (double) w / h;
if (sizes == null) return null;
Camera.Size optimalSize = null;
double minDiff = Double.MAX_VALUE;
int targetHeight = h;
// Try to find an size match aspect ratio and size
for (Camera.Size size : sizes) {
double ratio = (double) size.width / size.height;
if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue;
if (Math.abs(size.height - targetHeight) < minDiff) {
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}
// Cannot find the one match the aspect ratio, ignore the requirement
if (optimalSize == null) {
minDiff = Double.MAX_VALUE;
for (Camera.Size size : sizes) {
if (Math.abs(size.height - targetHeight) < minDiff) {
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}
}
return optimalSize;
}
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
if(mCamera != null) {
if (mPreviewSize!=null){
Camera.Parameters parameters = mCamera.getParameters();
parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height);
requestLayout();
mCamera.setParameters(parameters);
mCamera.startPreview();
}
}
}
}
我想在预览后在 android 中保持图像支持多屏。
最佳答案
要没有拉伸(stretch)图像或预览,您应该选择与手机屏幕保持相同比例的预览尺寸。然后,您应该在启动和启动相机之前设置它。试试这个代码:
public void setCamera(Camera camera, int screenW, int screenH) {
//screenW ==> screen width of the phone in Pixels
//screenH ==> screen height of the phone in Pixels
mCamera = camera;
if (mCamera != null) {
mSupportedPreviewSizes = mCamera.getParameters().getSupportedPreviewSizes();
if (mSupportedPreviewSizes != null) {
mPreviewSize = getOptimalPreviewSize(mSupportedPreviewSizes, screenW
, screenH);
}
requestLayout();
// get Camera parameters
Camera.Parameters params = mCamera.getParameters();
if (mPreviewSize != null)
params.setPreviewSize(mPreviewSize.width, mPreviewSize.height);
List<String> focusModes = params.getSupportedFocusModes();
try {
if (focusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)) {
params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
} else if (focusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO)) {
params.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
} else if (focusModes.contains(Camera.Parameters.FOCUS_MODE_INFINITY)) {
params.setFocusMode(Camera.Parameters.FOCUS_MODE_INFINITY);
}
mCamera.setParameters(params);
Log.i(TAG, " getPreviewSize " + mCamera.getParameters().getPreviewSize().width + " X "
+ mCamera.getParameters().getPreviewSize().height);
Log.i(TAG, " getPictureSize " + mCamera.getParameters().getPictureSize().width + " X "
+ mCamera.getParameters().getPictureSize().height);
} catch (Exception e) {
}
}
}
关于android - android : Camera preview is stretched in Samsung Galaxy s4 mini issue android 中的多屏支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42690797/
我想在 galaxy fold 设备上查看我的页面时更改它的字体大小。但我不确定如何使用媒体查询来处理这个问题。任何人都可以帮助我并告诉我如何解决这个问题吗? 最佳答案 如果您需要对折叠版设备进行媒体
我想在 galaxy fold 设备上查看我的页面时更改它的字体大小。但我不确定如何使用媒体查询来处理这个问题。任何人都可以帮助我并告诉我如何解决这个问题吗? 最佳答案 如果您需要对折叠版设备进行媒体
我正在开发 Android Widget,需要区分 Galaxy S 和 Galaxy S2。我几乎阅读了所有关于屏幕尺寸和密度的文章。当然,我需要将新限定词与新限定词 Smallest Width
如何为 galaxy S3(720x1280 像素)和 galaxy Note(800x1280 像素)进行布局。 两者都是超高密度设备,因此我需要将两种设备的两组图像放在同一个文件夹 drawabl
我正在使用以下设置来初始化 MediaRecorder .我的应用程序在除三星以外的大多数设备上都能正常运行,并且在 MediaRecorder.stop() 上出现错误. recorder
我在连接到我的服务器以检查我的电话应用程序的凭据时遇到问题,我正在使用 phonegap 来开发它。 我已经检查过这些问题,但它们没有给我我正在寻找的东西 HTTP Requests in Phone
我想知道为什么 Galaxy S3 和 S4 从这个文件夹 (drawable-sw360dp-xhdpi) 获取图像?? 所有图像对于这些设备来说都显得非常大!另外,如果我将这些图像缩小,它们将不适
根据我的发现,Samsung galaxy s2 的分辨率为 480x800,而 s3 的分辨率为 1280x720。所以我认为我应该让我的图形设计师为我提供包含 480x800 背景图像的 hdpi
我有一部搭载 Android 4.0.2 和 NXP 演示板 PN532-C106 的 Galaxy Nexus 手机。 我正在尝试连接它们以使用 LLCP 协议(protocol)发送数据,我正在使
我在区分 samsung galaxy s4 和 samsung galaxy s3 的布局文件夹时遇到问题。我尝试过 layout-sw360dp、layout-sw360dp-xxhdpi、lay
我已经实现了一个 android 应用程序来在网络摄像头之间切换。我使用此代码 Android ICS and MJPEG using AsyncTask .它工作得很好。但是现在的问题。在对 Sam
我有一个奇怪的问题。我正在检索推特,它可以在模拟器和我的 Samsung Galaxy S 上运行,但它不能在我的 Galaxy Tab 10.1 上运行? 手机和标签页上都安装了相同的应用程序。从
我正在使用 FLASH_MODE_ON 打开相机 LED 灯。 三星 Galaxy Ace 只有三种闪光模式:开、关和自动。 FLASH_MODE_TORCH在三星 Galaxy Tab 和三星 Ga
我在安装以超时结束的 ansible 集合时遇到问题 # ansible-galaxy collection install community.general -vvvv ansible-galax
我正在尝试部署一个通过运行meteor部署appname创建的新应用程序,但它给了我这个错误...我使用我的meteor开发者用户名和密码登录... 我必须注册 Galaxy,还是无需注册就可以免费完
我正在尝试安装 Ansible Galaxy 集合,但我需要强制执行旧版本。 According to the documentation ,我尝试通过以下方式执行安装: $ ansible-gala
我正在尝试安装 Ansible Galaxy 集合,但我需要强制执行旧版本。 According to the documentation ,我尝试通过以下方式执行安装: $ ansible-gala
我的 friend 用他的新 galaxy 选项卡试用了我的应用程序,它似乎与我测试它的模拟器略有不同。他的应用程序选项菜单是黑色的,而不是白色背景,你无法真正看到任何选项,而且大多数应用程序都无法正
我是Andoid新手我想为 Galaxy 选项卡设计布局以及其他布局。我设计了四种布局Layout-small、large、xlarge 和 normal 布局。但是当我试图在 Galaxy 选项卡中
我想要做的就是有一个特定于桌面的版本,然后是一个可以在 iPhone、Android、iPad 和任何其他手持设备上运行的移动版本。 我现在检测桌面的是: @media only screen and
我是一名优秀的程序员,十分优秀!