我正在尝试使用应用了颜色效果的相机预览,例如NEGATIVE效果。没有错误,预览可见而没有问题,但独立于我设置的ColorEffect - 相机预览保持不变。我通过运行params.getSupportedColorEffects()来测试我试图使用的效果是否可用于我的手机(这些效果也可以在内置的照片应用中使用)。
我不知道代码有什么问题 - 我在下面发布它。也许这里有人知道什么可以使这项工作?提前谢谢。
public class CustomCameraView extends SurfaceView{
Camera mCamera;
SurfaceHolder mHolder;
public CustomCameraView(Context context){
super(context);
mHolder = this.getHolder();
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
mHolder.addCallback(mSurfaceHolderListener);
}
SurfaceHolder.Callback mSurfaceHolderListener = new SurfaceHolder.Callback() {
public void surfaceCreated(SurfaceHolder holder) {
mCamera=Camera.open();
try {
mCamera.setPreviewDisplay(mHolder);
}
catch (Exception e){ }
}
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height)
{
Camera.Parameters params = mCamera.getParameters();
params.setColorEffect(Camera.Parameters.EFFECT_NEGATIVE);
mCamera.setParameters(params);
mCamera.startPreview();
}
public void surfaceDestroyed(SurfaceHolder arg0)
{
mCamera.stopPreview();
mCamera.release();
}
};
}
经过一些测试后发现问题可能与我正在测试的HTC Desire(或者可能是它的操作系统版本)有关。该代码在其他一些三星手机上正常工作。我还没弄清楚HTC会出现什么问题。
更新: 我设法让效果起作用,但真的是偶然的,我仍然不明白为什么。但我会在这里给出答案 - 也许有人会觉得它很有用,或者也许能解释为什么会这样:
我在surfaceChanged
方法中添加了以下行,因为我试图减小预览的大小:
previewHolder.setFixedSize(width, height-1);
这样可以使所选效果可见。
当我将此行更改为:
previewHolder.setFixedSize(width, height);
效果再也看不到了。很奇怪....它适用于设置高度小于接收高度参数的任何东西。
答案 0 :(得分:1)
我一直在努力解决这个问题。我发现HTC Desire它的相机需要执行setParameters
,setPreviewDisplay
和startPreview
的奇怪顺序才能使颜色效果起作用。订单是:
Camera.Parameters parameters = camera.getParameters();
//set the parameters
camera.setParameters(parameters);
camera.startPreview();
camera.setParameters(parameters);
camera.setPreviewDisplay(surfaceHolder);
在Android SDK中记录startPreview
之前调用setPreviewDisplay
,作为初始化相机和SurfaceView的方法。
关于让您的效果意外发挥作用的更新,同样的事情发生在我身上!我假设出于同样的原因,我的一些代码在快速连续中被调用了两次(在我的情况下由于数据库对象的变化)。这导致该方法(重新)设置参数并且(重新)开始预览以被调用两次以产生期望的结果。在意识到这一点之后,我的HTC Desire和Acer Iconia A500的上述顺序似乎都有用,我很满意。
然而,我刚收到一条评论,说我的应用程序说它会在HTC Desire HD上产生损坏的图像,所以我建议不要使用这个相机初始化顺序作为默认值,而是作为HTC Desire的修复。
答案 1 :(得分:0)
将新参数设置到相机并开始预览时invalidate()
正在调用SurfaceView
。但它只有Invalidate the whole view. If the view is visible, onDraw(android.graphics.Canvas) will be called at some point in the future.
所以不能保证会立即调用onDraw()
。但是onDraw()
总是在调用大小与当前大小不同的onMeasure()
后调用。所以这可能是这种奇怪行为的原因。
答案 2 :(得分:0)
简单答案使用以下类型:
Camera camera = null;
camera = Camera.open();
if (camera != null) {
try {
Camera.Parameters parameters = camera.getParameters();
// Set all kind of stuffs here..
parameters.setSceneMode(Camera.Parameters.FLASH_MODE_AUTO);
parameters.setColorEffect(Camera.Parameters.EFFECT_SEPIA); // whatever effect you want
camera.setParameters(parameters);
camera.setPreviewDisplay(surface_holder);
camera.startPreview();
} catch (IOException exception) {
camera.release();
camera = null;
}
}