2011-10-04 53 views
2

我有一个imageView多点触控大致基于this tutorial。其中一位评论者将一种半脏方法限制图像拖动到图像的边界,以便图像边缘不能被拖拽到其边缘之外。这种方法sorta工作,但不完全。它仅限制两条边的拖动。如何限制在Android图像平移边界imageView

有谁知道一个不太混乱,实际上限制图像拖动功能的方法?

这是Android应用开发未充分解决一个非常重要的概念....

我想以下思路:

1)setScaleType(scaleType.fitXY)当变焦= 1.0F(即最小变焦),只有在变焦> 1.0f时才启用拖动。

2)当zoom> 1.0f时,setScaleType(scaleType.MATRIX),然后确定图像边界和屏幕尺寸,并以某种方式对我来说太聪明了,使用if语句只允许在图像边缘不在屏幕上时进行拖动。我不知道该如何声明,是事情。

无论如何,为了完整性,这里是来自该链接的限制泛代码。这似乎是计算器上最流行的建议,但我认为我们可以做的更好:

// limit pan 
matrix.getValues(matrixValues); 
float currentY = matrixValues[Matrix.MTRANS_Y]; 
float currentX = matrixValues[Matrix.MTRANS_X]; 
float currentScale = matrixValues[Matrix.MSCALE_X]; 
float currentHeight = height * currentScale; 
float currentWidth = width * currentScale; 
float dx = event.getX() - start.x; 
float dy = event.getY() - start.y; 
float newX = currentX+dx; 
float newY = currentY+dy; 

RectF drawingRect = new RectF(newX, newY, newX+currentWidth, newY+currentHeight); 
float diffUp = Math.min(viewRect.bottom-drawingRect.bottom, viewRect.top-drawingRect.top); 
float diffDown = Math.max(viewRect.bottom-drawingRect.bottom, viewRect.top-drawingRect.top); 
float diffLeft = Math.min(viewRect.left-drawingRect.left, viewRect.right-drawingRect.right); 
float diffRight = Math.max(viewRect.left-drawingRect.left, viewRect.right-drawingRect.right); 
if(diffUp > 0){ 
dy +=diffUp; 
} 
if(diffDown < 0){ 
dy +=diffDown; 
} 
if(diffLeft> 0){ 
dx += diffLeft; 
} 
if(diffRight < 0){ 
dx += diffRight; 
} 
matrix.postTranslate(dx, dy); 

回答

5
private void limitDrag(Matrix m, ImageView view) { 


    float[] values = new float[9]; 
    m.getValues(values); 
    float transX = values[Matrix.MTRANS_X]; 
    float transY = values[Matrix.MTRANS_Y]; 
    float scaleX = values[Matrix.MSCALE_X]; 
    float scaleY = values[Matrix.MSCALE_Y]; 

    Rect bounds = view.getDrawable().getBounds(); 
    int viewWidth = getResources().getDisplayMetrics().widthPixels; 
    int viewHeight = getResources().getDisplayMetrics().heightPixels; 



    if(viewHeight<=480) 
    { 

     _y_up=0; 
    } 
    if(viewHeight>480&&viewHeight<980) 
    { 

     _y_up=140; 
    } 

    int width = bounds.right - bounds.left; 
    int height = bounds.bottom - bounds.top; 
    int __width=width; 
    int __height=height; 
    width = viewWidth/2; 
    height = viewHeight/2; 


    //height = 200 ; 
    float minX = (-width) ;//* scaleX; 
    float minY = (-height) ;//* scaleY; 


    if ((transX) > (viewWidth)) { 

     //_x_left 

     transX = viewWidth; 
    } else if (transX < minX) { 


     transX = minX; 
    } 


    if ((-transX) > (viewWidth)) { 
      // _x_right 
     transX = -(viewWidth); 
    } else if (-transX < minX) { 

     transX = -(minX+30); 
    } 



    if ((transY) > (viewHeight)) { 
    // _y_up 
     transY =(viewHeight); 


    } else if (transY < minY) { 

     transY = (minY+_y_up); 
    } 

    if ((-transY) > (viewHeight)) { 
    // _y_down 
     transY = -(viewHeight); 

    } else if (-transY < minY) { 

     transY = -(minY+170); 
    } 

    values[Matrix.MTRANS_X] = transX; 
    values[Matrix.MTRANS_Y] = transY; 
    m.setValues(values); 
} 

调用此您的view.setImageMatrix(矩阵)以上;

3

我意识到这是现在比较老,但试试这个。 imageWidth和imageHeight是非标度值。

private void limitDrag(Matrix m, ImageView view, int imageWidth, int imageHeight) { 
    float[] values = new float[9]; 
    m.getValues(values); 
    float[] orig = new float[] {0,0, imageWidth, imageHeight}; 
    float[] trans = new float[4]; 
    m.mapPoints(trans, orig); 

    float transLeft = trans[0]; 
    float transTop = trans[1]; 
    float transRight = trans[2]; 
    float transBottom = trans[3]; 
    float transWidth = transRight - transLeft; 
    float transHeight = transBottom - transTop; 

    float xOffset = 0; 
    if (transWidth > view.getWidth()) { 
     if (transLeft > 0) { 
      xOffset = -transLeft; 
     } else if (transRight < view.getWidth()) { 
      xOffset = view.getWidth() - transRight; 
     } 
    } else { 
     if (transLeft < 0) { 
      xOffset = -transLeft; 
     } else if (transRight > view.getWidth()) { 
      xOffset = -(transRight - view.getWidth()); 
     } 
    } 

    float yOffset = 0; 
    if (transHeight > view.getHeight()) { 
     if (transTop > 0) { 
      yOffset = -transTop; 
     } else if (transBottom < view.getHeight()) { 
      yOffset = view.getHeight() - transBottom; 
     } 
    } else { 
     if (transTop < 0) { 
      yOffset = -transTop; 
     } else if (transBottom > view.getHeight()) { 
      yOffset = -(transBottom - view.getHeight()); 
     } 
    } 

    float transX = values[Matrix.MTRANS_X]; 
    float transY = values[Matrix.MTRANS_Y]; 

    values[Matrix.MTRANS_X] = transX + xOffset; 
    values[Matrix.MTRANS_Y] = transY + yOffset; 
    m.setValues(values); 
} 
+0

你救了我的一天!奇妙的工作! –

+0

谢谢,这段代码帮了我很多,很好! –

+0

我只是要确保通过图像宽度和高度除以2,这很好!我发现它将转换后的值存储在RectF对象中稍微干净一点,该对象也计算了宽度和高度。 – Swindler