我想在相机预览模式下使用双指触摸手势进行缩放.但我无法做到这一点.我已经在ImageView上完成了Zoom控制,它工作正常.现在我想在相机预览模式中这样做,即当我们启动相机时,我们可以使用双指手势进行缩放.
下面我添加了用于缩放图像的双指手势代码.
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
ImageView view = (ImageView) v;
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
savedMatrix.set(matrix);
start.set(event.getX(), event.getY());
Log.d(TAG, "mode=DRAG");
mode = DRAG;
break;
case MotionEvent.ACTION_POINTER_DOWN:
oldDist = spacing(event);
Log.d(TAG, "oldDist=" + oldDist);
if (oldDist > 10f) {
savedMatrix.set(matrix);
midPoint(mid, event);
mode = ZOOM;
Log.d(TAG, "mode=ZOOM");
}
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
mode = NONE;
Log.d(TAG, "mode=NONE");
break;
case MotionEvent.ACTION_MOVE:
if (mode == DRAG) {
// for draging the image
matrix.set(savedMatrix); matrix.postTranslate(event.getX() -
start.x, event.getY() - start.y);
break;
} else if (mode == ZOOM) {
float newDist = spacing(event);
Log.d(TAG, "newDist=" + newDist);
if (newDist > 10f) {
matrix.set(savedMatrix);
float scale = newDist / oldDist;
matrix.postScale(scale, scale, mid.x, mid.y);
}
}
break;
}
view.setImageMatrix(matrix);
return true;
}
Run Code Online (Sandbox Code Playgroud)
请指导我如何在相机预览中执行此手势变焦控制.至少提供教程链接.
感谢Vikash
这是我在github上找到的解决方案:https: //github.com/Betulaphobe/ChatCapsule/blob/8d4f00a7d4c9166aa7ce974670fdf3033a6064f4/chc_application/src/chc/helpers/CameraPreview.java
@Override
public boolean onTouchEvent(MotionEvent event) {
// Get the pointer ID
Camera.Parameters params = mCamera.getParameters();
int action = event.getAction();
if (event.getPointerCount() > 1) {
// handle multi-touch events
if (action == MotionEvent.ACTION_POINTER_DOWN) {
mDist = getFingerSpacing(event);
} else if (action == MotionEvent.ACTION_MOVE && params.isZoomSupported()) {
mCamera.cancelAutoFocus();
handleZoom(event, params);
}
} else {
// handle single touch events
if (action == MotionEvent.ACTION_UP) {
handleFocus(event, params);
}
}
return true;
}
private void handleZoom(MotionEvent event, Camera.Parameters params) {
int maxZoom = params.getMaxZoom();
int zoom = params.getZoom();
float newDist = getFingerSpacing(event);
if (newDist > mDist) {
//zoom in
if (zoom < maxZoom)
zoom++;
} else if (newDist < mDist) {
//zoom out
if (zoom > 0)
zoom--;
}
mDist = newDist;
params.setZoom(zoom);
mCamera.setParameters(params);
}
public void handleFocus(MotionEvent event, Camera.Parameters params) {
int pointerId = event.getPointerId(0);
int pointerIndex = event.findPointerIndex(pointerId);
// Get the pointer's current position
float x = event.getX(pointerIndex);
float y = event.getY(pointerIndex);
List<String> supportedFocusModes = params.getSupportedFocusModes();
if (supportedFocusModes != null && supportedFocusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO)) {
mCamera.autoFocus(new Camera.AutoFocusCallback() {
@Override
public void onAutoFocus(boolean b, Camera camera) {
// currently set to auto-focus on single touch
}
});
}
}
/** Determine the space between the first two fingers */
private float getFingerSpacing(MotionEvent event) {
// ...
float x = event.getX(0) - event.getX(1);
float y = event.getY(0) - event.getY(1);
return FloatMath.sqrt(x * x + y * y);
}
Run Code Online (Sandbox Code Playgroud)
我得到了我的问题的解决方案,以下是解决方案。
case MotionEvent.ACTION_MOVE:
if (mode == ZOOM) {
float newDist = spacing(event);
double zoomDist = newDist-oldDist;
if(zoomDist > 0){
if(zoomDist > 50 && zoomDist <= 200){
if (curZoomLevel < mZoomMax && gestureZoom == 0) {
gestureZoom ++;
GestureZoomIn();
}
}else if(zoomDist > 200 && zoomDist <= 300){
if (curZoomLevel < mZoomMax && gestureZoom == 1) {
gestureZoom ++;
GestureZoomIn();
}
}else if(zoomDist > 300 && zoomDist <= 400){
if (curZoomLevel < mZoomMax && gestureZoom == 2) {
gestureZoom++;
GestureZoomIn();
}
Run Code Online (Sandbox Code Playgroud)
//
private void GestureZoomIn(){
if (mParameters.isZoomSupported()){
mZoomMax = mParameters.getMaxZoom();
if (zoom_text_value<mZoomMax) {
zoom_text_value++;
curZoomLevel++;
zoom_float=zoom_float+0.5;
onZoomValueChanged(curZoomLevel);
Run Code Online (Sandbox Code Playgroud)
//
private void GestureZoomOut(){
if (mParameters.isZoomSupported()){
if (0<zoom_text_value) {
zoom_text_value--;
curZoomLevel--;
zoom_float=zoom_float-0.5;
onZoomValueChanged(curZoomLevel);
Run Code Online (Sandbox Code Playgroud)
上面的代码我用来实现相机审查中的多重变焦。