Я хотел бы эффективно сделать простой цифровой зум для предварительного просмотра камеры, поэтому я решил просто изменить размер SurfaceView, чтобы он был больше экрана. Другие вопросы (например, 3813049 ), похоже, указывают на то, что это легко, поэтому я создал пример кода, который, как я ожидаю, позволит мне видеть только половину изображения по горизонтали (поскольку SurfaceView в два раза шире экрана), а изображение занимает только половину экрана по горизонтали. Однако его запуск (когда он нацелен на SDK версии 4 на моем Thunderbolt с Android 2.2.1) приводит к возможности видеть все изображение по горизонтали при заполнении экрана по горизонтали. Кажется, что SurfaceView ведет себя так, как задумано по вертикали (когда я делаю его меньше экрана), но Android не позволяет мне сделать SurfaceView больше экрана.
Как я могу реализовать цифровое масштабирование? (Нет, я не могу использовать Camera.Parameters.setZoom; это не только не поддерживается Android 1.6, но и разные камеры поддерживают и реализуют это по-разному)
public class MagnifyTestActivity extends Activity implements SurfaceHolder.Callback {
private MagnificationView mPreview;
private SurfaceHolder mHolder;
private Camera mCamera = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mPreview = new MagnificationView(this);
setContentView(mPreview);
mHolder = mPreview.getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
public class MagnificationView extends SurfaceView {
public MagnificationView(Context context) {
super(context);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
Display display = getWindowManager().getDefaultDisplay();
int width = display.getWidth()*2;
int height = display.getHeight()/2;
widthMeasureSpec = MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY);
heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
public void surfaceCreated(SurfaceHolder holder) {
mCamera = Camera.open();
try {
mCamera.setPreviewDisplay(holder);
} catch (IOException e) {
e.printStackTrace();
}
}
public void surfaceDestroyed(SurfaceHolder holder) {
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
mHolder.setFixedSize(w, h);
mCamera.startPreview();
}
}
ОБНОВЛЕНИЕ: на основе ответа @Pulkit Sethi, можно растягивать / увеличивать SurfaceView по вертикали, но не по горизонтали. Чтобы увеличить SurfaceView по вертикали, просто замените display.getHeight () / 2 на display.getHeight () * 2 выше. Также обратите внимание, что изменение ширины не приводит к увеличению по горизонтали ни в моем коде, ни в Pulkit.