Я пытаюсь получить предварительный просмотр камеры с примененным к нему цветовым эффектом, например, ОТРИЦАТЕЛЬНЫМ. Ошибок нет, и предварительный просмотр виден без проблем, но независимо от установленного мной 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, на котором я тестировал (или, возможно, с его версией ОС). Код работает правильно на некоторых других телефонах Samsung. Я не понял, в чем может быть проблема на HTC.
UPDATE:
Мне удалось заставить эффекты работать, но действительно случайно, и я до сих пор не понимаю, почему. Но я дам здесь ответ - возможно, кто-то найдет его полезным, или, возможно, сможет объяснить, почему это происходит так:
Я добавил следующую строку в метод surfaceChanged
, потому что пытался уменьшить размер предварительного просмотра:
previewHolder.setFixedSize(width, height-1);
Это привело к тому, что выбранный эффект стал видимым.
Когда я изменил эту строку на:
previewHolder.setFixedSize(width, height);
эффект больше не был виден. Странно .... это работает для установленной высоты, которая меньше, чем полученный параметр высоты.