我已经看过关于这个问题的其他几个问题,但似乎都没有解决我的问题。我有一个工作正常的自定义相机应用程序,除缩放按钮外的所有东西。这是使用SDK min 8 target 14的代码:
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
if (isPreviewing){
camera.stopPreview();
}
Camera.Parameters p = camera.getParameters();
p.setPreviewSize(sizes.get(0).width, sizes.get(0).height);
p.setColorEffect(effect);
zoomControls = (ZoomControls) findViewById(R.id.zoomControls);
if (p.isZoomSupported()) {
maxZoomLevel = p.getMaxZoom();
Toast.makeText(PictureTaker.this, String.valueOf(maxZoomLevel),Toast.LENGTH_LONG).show();
zoomControls.setIsZoomInEnabled(true);
zoomControls.setIsZoomOutEnabled(true);
zoomControls.setOnZoomInClickListener(new OnClickListener() {
public void onClick(View v) {
if (currentZoomLevel < maxZoomLevel) {
currentZoomLevel++;
camera.startSmoothZoom(currentZoomLevel);
//Toast.makeText(PictureTaker.this, String.valueOf(currentZoomLevel),Toast.LENGTH_LONG).show();
}
}
});
zoomControls.setOnZoomOutClickListener(new OnClickListener() {
public void onClick(View v) {
if (currentZoomLevel > 0) {
currentZoomLevel--;
camera.startSmoothZoom(currentZoomLevel);
}
}
});
} else {
zoomControls.setVisibility(View.GONE);
}
camera.setParameters(p);
try {
camera.setPreviewDisplay(holder);
} // end try
catch (IOException e) {
Log.v(TAG, e.toString());
} // end catch
camera.startPreview(); // begin the preview
isPreviewing = true;
}
setColorEffect来自选项菜单,效果很好。我知道isZoomSupported和getMaxZoom正在工作,因为Toast在代码运行时显示“59”,但缩放按钮什么都不做。这是来自XML的zoomControl
<ZoomControls
android:id="@+id/zoomControls"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="17dp"
android:baselineAligned="false"
android:gravity="center_horizontal"
android:orientation="horizontal" />
我在Manifest中拥有所有必要的权限,并且LogCat中没有显示任何错误。不知道我做错了什么。我添加了第二个Toast来报告按下按钮时是否更改了currentZoomLevel,并且每次都显示值增加1。我也尝试过不使用startSmoothZoom并只使用
设置缩放p.setZoom(currentZoomLevel); or p.setZoomLevel(15);
并且两者都不起作用。我的手机,HTC Incredible确实在其原生相机应用程序上有一个完美的工作变焦。如果我注释掉代码的zoomControl部分,一切正常,自定义相机的所有其他功能都工作正常,即使在那里使用zoomControl代码,它也不会缩放。
答案 0 :(得分:5)
想出来,也许这可以帮助其他一些有类似问题的人。这是光滑的。猜猜我的HTC不支持这个。
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
if (isPreviewing){
camera.stopPreview();
}
p = camera.getParameters();
p.setPreviewSize(sizes.get(0).width, sizes.get(0).height);
p.setColorEffect(effect);
if (p.isZoomSupported() && p.isSmoothZoomSupported()) {
//most phones
maxZoomLevel = p.getMaxZoom();
zoomControls.setIsZoomInEnabled(true);
zoomControls.setIsZoomOutEnabled(true);
zoomControls.setOnZoomInClickListener(new OnClickListener() {
public void onClick(View v) {
if (currentZoomLevel < maxZoomLevel) {
currentZoomLevel++;
camera.startSmoothZoom(currentZoomLevel);
}
}
});
zoomControls.setOnZoomOutClickListener(new OnClickListener() {
public void onClick(View v) {
if (currentZoomLevel > 0) {
currentZoomLevel--;
camera.startSmoothZoom(currentZoomLevel);
}
}
});
} else if (p.isZoomSupported() && !p.isSmoothZoomSupported()){
//stupid HTC phones
maxZoomLevel = p.getMaxZoom();
zoomControls.setIsZoomInEnabled(true);
zoomControls.setIsZoomOutEnabled(true);
zoomControls.setOnZoomInClickListener(new OnClickListener() {
public void onClick(View v) {
if (currentZoomLevel < maxZoomLevel) {
currentZoomLevel++;
p.setZoom(currentZoomLevel);
camera.setParameters(p);
}
}
});
zoomControls.setOnZoomOutClickListener(new OnClickListener() {
public void onClick(View v) {
if (currentZoomLevel > 0) {
currentZoomLevel--;
p.setZoom(currentZoomLevel);
camera.setParameters(p);
}
}
});
}else{
//no zoom on phone
zoomControls.setVisibility(View.GONE);
}
camera.setParameters(p);
try {
camera.setPreviewDisplay(holder);
} // end try
catch (IOException e) {
Log.v(TAG, e.toString());
} // end catch
camera.startPreview(); // begin the preview
isPreviewing = true;
} // end method surfaceChanged
这让我的HTC可以放大步伐。关键是在每次单击按钮后设置摄像机的参数。你可以将currentZoomLevel设置为你想要的任何数字,基于maxZoomLevel(我的HTC是59但我的Droid 4只有15),在点击ZoomControls期间使设备放大和缩小的速度更快。可能是一个更整洁的代码编写方式,应该进行一些检查以确保maxZoomSize不返回NULL或其他东西,但它正在多个设备上工作。
答案 1 :(得分:1)
简单忘记startSmoothZoom()方法
遵循:
Camera.Parameters params = camera.getParameters();
params.setZoom(zoom_value);
camera.setParameters(params);
答案 2 :(得分:0)
params.setZoom(currentZoomLevel); camera.setParameters(PARAMS);代码也适用于我的三星G3手机。