Ben*_*Ben 13 camera android zoom surfaceview
我想有效地为相机预览做一个简单的数码变焦,所以我想我只需要将SurfaceView的大小调整为大于屏幕.其他问题(例如3813049)似乎表明这很容易,所以我创建了下面的示例代码,我希望让我只能看到水平图像的一半(因为SurfaceView的宽度是屏幕的两倍)并且具有图像只占水平屏幕的一半.但是,运行它(当我的Thunderbolt上使用Android 2.2.1定位到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();
}
}
Run Code Online (Sandbox Code Playgroud)
更新:根据@Pulkit Sethi的响应,可以垂直拉伸/放大SurfaceView,而不是水平放大/放大.要垂直放大SurfaceView,只需将display.getHeight()/ 2替换为上面的display.getHeight()*2即可.还要注意,在我的代码或Pulkit中,改变宽度不会产生任何水平放大.
小智 1
你不能让你的surfaceView比屏幕大。话虽这么说,还是有办法解决的。
我发现你可以调整 SurfaceView 中画布的大小,这将允许缩放。
public class DrawingThread extends Thread {
private MagnificationView mainPanel;
private SurfaceHolder surfaceHolder;
private boolean run;
public DrawingThread(SurfaceHolder surface, MagnificationView panel){
surfaceHolder = surface;
mainPanel = panel;
}
public SurfaceHolder getSurfaceHolder(){
return surfaceHolder;
}
public void setRunning (boolean run){
this.run = run;
}
public void run(){
Canvas c;
while (run){
c = null;
try {
c = surfaceHolder.lockCanvas(null);
synchronized (surfaceHolder){
mainPanel.OnDraw(c);
}
} finally {
if (c != null){
surfaceHolder.unlockCanvasAndPost(c);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
}
在MagnificationView类中添加一个方法:
public void OnDraw(Canvas canvas){
if (canvas!=null){
canvas.save();
canvas.scale(scaleX,scaleY);
canvas.restore();
}
}
Run Code Online (Sandbox Code Playgroud)
DrawingThread 将是您在 Activity 中启动的线程。另外,在您的 MagnificationView 类中,重写 OnTouchEvent 来处理您自己的捏缩放(这将修改scaleX和scaleY。
希望这能解决您的问题
| 归档时间: |
|
| 查看次数: |
6406 次 |
| 最近记录: |