Как сделать SurfaceView больше, чем экран?

Я хотел бы эффективно сделать простой цифровой зум для предварительного просмотра камеры, поэтому я решил просто изменить размер 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.

13
задан Community 23 May 2017 в 11:55
поделиться