implement pinch zooming
This commit is contained in:
parent
a43d82d8a0
commit
73f17fe8ed
|
@ -50,6 +50,7 @@ public class Preview extends ViewGroup
|
||||||
private static Uri mTargetUri;
|
private static Uri mTargetUri;
|
||||||
private static Context mContext;
|
private static Context mContext;
|
||||||
private static ScaleGestureDetector mScaleGestureDetector;
|
private static ScaleGestureDetector mScaleGestureDetector;
|
||||||
|
private static List<Integer> mZoomRatios;
|
||||||
|
|
||||||
private static boolean mCanTakePicture;
|
private static boolean mCanTakePicture;
|
||||||
private static boolean mIsFlashEnabled;
|
private static boolean mIsFlashEnabled;
|
||||||
|
@ -64,6 +65,7 @@ public class Preview extends ViewGroup
|
||||||
private static int mLastClickY;
|
private static int mLastClickY;
|
||||||
private static int mInitVideoRotation;
|
private static int mInitVideoRotation;
|
||||||
private static int mCurrCameraId;
|
private static int mCurrCameraId;
|
||||||
|
private static int mMaxZoom;
|
||||||
|
|
||||||
public Preview(Context context) {
|
public Preview(Context context) {
|
||||||
super(context);
|
super(context);
|
||||||
|
@ -120,6 +122,8 @@ public class Preview extends ViewGroup
|
||||||
mCamera = newCamera;
|
mCamera = newCamera;
|
||||||
if (mCamera != null) {
|
if (mCamera != null) {
|
||||||
mParameters = mCamera.getParameters();
|
mParameters = mCamera.getParameters();
|
||||||
|
mMaxZoom = mParameters.getMaxZoom();
|
||||||
|
mZoomRatios = mParameters.getZoomRatios();
|
||||||
mSupportedPreviewSizes = mParameters.getSupportedPreviewSizes();
|
mSupportedPreviewSizes = mParameters.getSupportedPreviewSizes();
|
||||||
Collections.sort(mSupportedPreviewSizes, new SizesComparator());
|
Collections.sort(mSupportedPreviewSizes, new SizesComparator());
|
||||||
requestLayout();
|
requestLayout();
|
||||||
|
@ -165,8 +169,41 @@ public class Preview extends ViewGroup
|
||||||
mScaleGestureDetector = new ScaleGestureDetector(mContext, new ScaleGestureDetector.SimpleOnScaleGestureListener() {
|
mScaleGestureDetector = new ScaleGestureDetector(mContext, new ScaleGestureDetector.SimpleOnScaleGestureListener() {
|
||||||
@Override
|
@Override
|
||||||
public boolean onScale(ScaleGestureDetector detector) {
|
public boolean onScale(ScaleGestureDetector detector) {
|
||||||
final float factor = detector.getScaleFactor();
|
int zoomFactor = mParameters.getZoom();
|
||||||
return super.onScale(detector);
|
float zoomRatio = mZoomRatios.get(zoomFactor) / 100.f;
|
||||||
|
zoomRatio *= detector.getScaleFactor();
|
||||||
|
|
||||||
|
int newZoomFactor = zoomFactor;
|
||||||
|
if (zoomRatio <= 1.f) {
|
||||||
|
newZoomFactor = 0;
|
||||||
|
} else if (zoomRatio >= mZoomRatios.get(mMaxZoom) / 100.f) {
|
||||||
|
newZoomFactor = mMaxZoom;
|
||||||
|
} else {
|
||||||
|
if (detector.getScaleFactor() > 1.f) {
|
||||||
|
for (int i = zoomFactor; i < mZoomRatios.size(); i++) {
|
||||||
|
if (mZoomRatios.get(i) / 100.0f >= zoomRatio) {
|
||||||
|
newZoomFactor = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (int i = zoomFactor; i >= 0; i--) {
|
||||||
|
if (mZoomRatios.get(i) / 100.0f <= zoomRatio) {
|
||||||
|
newZoomFactor = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
newZoomFactor = Math.max(newZoomFactor, 0);
|
||||||
|
newZoomFactor = Math.min(mMaxZoom, newZoomFactor);
|
||||||
|
|
||||||
|
mParameters.setZoom(newZoomFactor);
|
||||||
|
if (mCamera != null)
|
||||||
|
mCamera.setParameters(mParameters);
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -555,7 +592,9 @@ public class Preview extends ViewGroup
|
||||||
public boolean onTouch(View v, MotionEvent event) {
|
public boolean onTouch(View v, MotionEvent event) {
|
||||||
mLastClickX = (int) event.getX();
|
mLastClickX = (int) event.getX();
|
||||||
mLastClickY = (int) event.getY();
|
mLastClickY = (int) event.getY();
|
||||||
mScaleGestureDetector.onTouchEvent(event);
|
|
||||||
|
if (mMaxZoom > 0)
|
||||||
|
mScaleGestureDetector.onTouchEvent(event);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue