Я хотел бы сделать простой цифровой зум для предварительного просмотра камеры, поэтому я подумал, что просто изменил бы размер 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();
}
}
UPDATE: на основе ответа @Pulkit Sethi можно растянуть/увеличить SurfaceView вертикально, а не горизонтально. Чтобы увеличить SurfaceView вертикально, просто замените display.getHeight()/2 на display.getHeight() * 2 выше. Также обратите внимание, что изменение ширины не приводит к горизонтальному увеличению, как в моем коде, так и в Pulkit's.