¿Cómo puedo hacer un SurfaceView más grande que la pantalla?

Me gustaría hacer un zoom digital simple para la vista previa de la cámara, así que pensé que simplemente cambiaría el tamaño de mi SurfaceView para que fuera más grande que la pantalla. Otras preguntas (como 3813049) parece indicar que esto es fácil, así que creé el código de muestra debajo del cual espero permitirme ver solo la mitad de la imagen horizontalmente (ya que SurfaceView es el doble de ancho que la pantalla) y hacer que la imagen solo ocupe la mitad de la pantalla horizontalmente. Sin embargo, ejecutarlo (cuando está dirigido a la versión 4 del SDK en mi Thunderbolt con Android 2.2.1) permite ver toda la imagen horizontalmente mientras llena la pantalla horizontalmente. SurfaceView parece comportarse verticalmente (cuando lo hago más pequeño que la pantalla), pero Android no me permite hacer SurfaceView más grande que la pantalla.

¿Cómo puedo implementar un zoom digital? (No, no puedo usar Camera.Parameters.setZoom; no solo no es compatible con Android 1.6, sino que diferentes cámaras admiten e implementan esto de manera diferente)

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: según la respuesta de @Pulkit Sethi, es posible estirar / ampliar SurfaceView verticalmente, pero no horizontalmente. Para ampliar el SurfaceView verticalmente, simplemente reemplace display.getHeight () / 2 con display.getHeight () * 2 arriba. Observe también que cambiar el ancho no produce ningún aumento horizontal, ni en mi código ni en Pulkit's.

Respuestas a la pregunta(4)

Su respuesta a la pregunta