android view大于屏幕,android – 如何使一个SurfaceView比屏幕大?

我想有效地做一个简单的数码变焦的相机预览,所以我以为我会简单地调整我的SurfaceView大于屏幕.其他问题(例如

3813049)似乎表明这很容易,所以我创建了下面的示例代码,我希望让我仅仅看到水平的一半图像(因为SurfaceView是屏幕的两倍),并且图像只占据屏幕的一半水平.但是,运行它(当使用Android 2.2.1在Thunderbolt上针对SDK版本4)时,可以在水平填充屏幕时水平看到整个图像. 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的.

//Activity class

public class CameraActivity extends Activity implements SurfaceListener {

private static final String TAG = "CameraActivity";

Camera mCamera;

CameraPreview mPreview;

private FrameLayout mCameraPreview;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

requestWindowFeature(Window.FEATURE_NO_TITLE);

setContentView(R.layout.activity_camera);

mCamera = getCameraInstance();

mPreview = new CameraPreview(this, mCamera);

mCameraPreview = (FrameLayout) findViewById(R.id.camera_preview);

mCameraPreview.addView(mPreview);

}

@Override

protected void onPause() {

super.onPause();

releaseCamera();

}

private Camera getCameraInstance() {

Camera camera = null;

try {

camera = Camera.open();

} catch (Exception e) {

}

return camera;

}

private void releaseCamera() {

if (null != mCamera) {

mCamera.release();

}

mCamera = null;

}

@Override

public void surfaceCreated() {

//Change these mate

int width = 1000;

int height = 1000;

// Set parent window params

getWindow().setLayout(width, height);

RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(

width, height);

mCameraPreview.setLayoutParams(params);

mCameraPreview.requestLayout();

}

}

// Preview class

public class CameraPreview extends SurfaceView implements

SurfaceHolder.Callback {

private static final String TAG = "CameraPreview";

Context mContext;

Camera mCamera;

SurfaceHolder mHolder;

public interface SurfaceListener{

public void surfaceCreated();

}

SurfaceListener listener;

public CameraPreview(Context context, Camera camera) {

super(context);

mContext = context;

listener = (SurfaceListener)mContext;

mCamera = camera;

mHolder = getHolder();

mHolder.addCallback(this);

// Required prior 3.0 HC

mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

}

@Override

public void surfaceCreated(SurfaceHolder holder) {

try {

mCamera.setPreviewDisplay(holder);

Parameters params = mCamera.getParameters();

//Change parameters here

mCamera.setParameters(params);

mCamera.startPreview();

listener.surfaceCreated();

} catch (Exception e) {

// TODO: handle exception

}

}

public void surfaceDestroyed(SurfaceHolder holder) {

// empty. Take care of releasing the Camera preview in your activity.

}

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {

// If your preview can change or rotate, take care of those events here.

// Make sure to stop the preview before resizing or reformatting it.

Log.i(TAG, "Surface changed called");

if (mHolder.getSurface() == null) {

// preview surface does not exist

return;

}

// stop preview before making changes

try {

mCamera.stopPreview();

} catch (Exception e) {

// ignore: tried to stop a non-existent preview

}

// set preview size and make any resize, rotate or

// reformatting changes here

mCamera.setDisplayOrientation(90);

// start preview with new settings

try {

mCamera.setPreviewDisplay(mHolder);

mCamera.startPreview();

} catch (Exception e) {

Log.d(TAG, "Error starting camera preview: " + e.getMessage());

}

}

}

//Layout file

android:layout_width="match_parent"

android:layout_height="match_parent" >

android:id="@+id/camera_preview"

android:layout_width="300dp"

android:layout_height="400dp"

android:layout_centerHorizontal="true"

android:paddingTop="10dp" >

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值