如何在安卓系统中启用图片的双指缩放功能?

8

可能是重复问题:
android imageView:设置拖动和缩放参数

我对Android很陌生。 我在我的布局中有一个图像视图。 我希望启用从此图像视图传来的图像的缩放功能,缩放应该在两个手指触摸时完成。 有人能告诉我如何实现这一点吗?

谢谢,

Raj


请查看此帖子:https://dev59.com/j-o6XIcBkEYKwwoYTS1D - Abhi
1个回答

13

看这个

private static final String TAG = "Touch";

//These matrices will be used to move and zoom image
Matrix matrix = new Matrix();
Matrix savedMatrix = new Matrix();  

// We can be in one of these 3 states
static final int NONE = 0;
static final int DRAG = 1;
static final int ZOOM = 2;
static final int DRAW =3;
int mode = NONE;

// Remember some things for zooming
PointF start = new PointF();
PointF mid = new PointF();
float oldDist = 1f;

// Limit zoomable/pannable image
private float[] matrixValues = new float[9];
private float maxZoom;
private float minZoom;
private float height;
private float width;
private RectF viewRect;
/////////************ touch events functions **************////////////////////
@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    if(hasFocus){  init();   }
}
private void init() {
    maxZoom = 4;
    minZoom = 0.25f;
    height = myimage.getDrawable().getIntrinsicHeight()+20;
    width = myimage.getDrawable().getIntrinsicWidth()+20;
    viewRect = new RectF(0, 0, myimage.getWidth()+20, myimage.getHeight()+20);
}

  /////////************touch events for image Moving, panning and zooming   ***********///
public boolean onTouch(View v, MotionEvent event) {

    // Dump touch event to log
    dumpEvent(event);
    // Handle touch events here...
    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 == DRAW){ onTouchEvent(event);}
        if (mode == DRAG) {
                ///code for draging..        
        } 
     else if (mode == ZOOM) {
         float newDist = spacing(event);
         Log.d(TAG, "newDist=" + newDist);
         if (newDist > 10f) {
             matrix.set(savedMatrix);
             float scale = newDist / oldDist;
             matrix.getValues(matrixValues);
             float currentScale = matrixValues[Matrix.MSCALE_X];
             // limit zoom
             if (scale * currentScale > maxZoom) {
                 scale = maxZoom / currentScale; 
                }else if(scale * currentScale < minZoom){
                    scale = minZoom / currentScale; 
                 }
             matrix.postScale(scale, scale, mid.x, mid.y);
            }
     }
     break;
    }
    myimage.setImageMatrix(matrix);
    return true; // indicate event was handled
}

//*******************Determine the space between the first two fingers
private float spacing(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);
}

//************* Calculate the mid point of the first two fingers 
private void midPoint(PointF point, MotionEvent event) {
   float x = event.getX(0) + event.getX(1);
   float y = event.getY(0) + event.getY(1);
   point.set(x / 2, y / 2);
}
}    

使用上述代码,我可以成功地进行缩放。但是图像会移出我的布局。有没有可能限制图像在布局内缩放,使得初始图像大小等于屏幕大小? - Keerthiraj
你好,能告诉我如何将图片限制在屏幕内吗? - Keerthiraj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接