Created
November 20, 2011 19:04
-
-
Save acidsound/1380708 to your computer and use it in GitHub Desktop.
SurfaceView Example
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.io.IOException; | |
import java.util.List; | |
import android.content.Context; | |
import android.hardware.Camera; | |
import android.hardware.Camera.Size; | |
import android.util.Log; | |
import android.view.SurfaceHolder; | |
import android.view.SurfaceHolder.Callback; | |
import android.view.SurfaceView; | |
public class OverlayView extends SurfaceView implements Callback { | |
SurfaceHolder mHolder; | |
Camera mCamera; | |
public OverlayView(Context context) { | |
super(context); | |
// Install a SurfaceHolder.Callback so we get notified when the | |
// underlying surface is created and destroyed. | |
mHolder = getHolder(); | |
mHolder.addCallback(this); | |
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); | |
} | |
public void surfaceCreated(SurfaceHolder holder) { | |
// The Surface has been created, acquire the camera and tell it where | |
// to draw. | |
mCamera = Camera.open(); | |
mCamera.setDisplayOrientation(90); | |
try { | |
mCamera.setPreviewDisplay(holder); | |
} catch (IOException e) { | |
mCamera.release(); | |
mCamera = null; | |
} | |
} | |
public void surfaceDestroyed(SurfaceHolder holder) { | |
// Surface will be destroyed when we return, so stop the preview. | |
// Because the CameraDevice object is not a shared resource, it's very | |
// important to release it when the activity is paused. | |
mCamera.stopPreview(); | |
mCamera.release(); | |
mCamera = null; | |
} | |
private Size getOptimalPreviewSize(List<Size> sizes, int w, int h) { | |
final double ASPECT_TOLERANCE = 0.1; | |
double targetRatio = (double) w / h; | |
if (sizes == null) return null; | |
Size optimalSize = null; | |
double minDiff = Double.MAX_VALUE; | |
int targetHeight = h; | |
// Try to find an size match aspect ratio and size | |
for (Size size : sizes) { | |
double ratio = (double) size.width / size.height; | |
if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue; | |
if (Math.abs(size.height - targetHeight) < minDiff) { | |
optimalSize = size; | |
minDiff = Math.abs(size.height - targetHeight); | |
} | |
} | |
// Cannot find the one match the aspect ratio, ignore the requirement | |
if (optimalSize == null) { | |
minDiff = Double.MAX_VALUE; | |
for (Size size : sizes) { | |
if (Math.abs(size.height - targetHeight) < minDiff) { | |
optimalSize = size; | |
minDiff = Math.abs(size.height - targetHeight); | |
} | |
} | |
} | |
return optimalSize; | |
} | |
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { | |
// Now that the size is known, set up the camera parameters and begin | |
// the preview. | |
Camera.Parameters parameters = mCamera.getParameters(); | |
List<Size> sizes = parameters.getSupportedPreviewSizes(); | |
Size optimalSize = getOptimalPreviewSize(sizes, w, h); | |
Log.d("DEBUG", optimalSize.width + "," + optimalSize.height); | |
parameters.setPreviewSize(optimalSize.width, optimalSize.height); | |
mCamera.setParameters(parameters); | |
mCamera.startPreview(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment