android - 如何在 Android imageView 中限制图像平移边界

标签 android image scale

我有一个带有多点触控的 imageView,大致基于 this tutorial .那里的一位评论者提出了一种半脏方法,将图像拖动限制在图像的边界内,这样图像边缘就不能被拖动到其边缘之外。这种方法有点管用,但不完全管用。它只限制两条边的拖动。

有谁知道限制图像拖动的不那么困惑且实用的方法吗?

对于 Android 应用程序开发而言,这是一个非常重要的概念,但尚未得到充分解决....

我想到了以下想法:

1) setScaleType(scaleType.fitXY) when zoom = 1.0F (i.e. min zoom), drag only enabled when zoom > 1.0f

2) 当 zoom > 1.0f 时,setScaleType(scaleType.MATRIX),然后你确定图像边界和屏幕尺寸,在某种程度上这对我来说太聪明了,使用 if 语句你只允许在图像边缘时拖动不在屏幕上。我不知道如何声明,就是这样。

无论如何,为了完整起见,这里是来自该链接的限制泛代码。这似乎是 stackoverflow 上最受欢迎的建议,但我认为我们可以做得更好:

// 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);

最佳答案

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(matrix) 上面调用它;

关于android - 如何在 Android imageView 中限制图像平移边界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7651033/

相关文章:

javascript - (循环中的图像)大量图像并且想要显示如果图像确实存在则显示图像否则删除/隐藏图像节点

html - 使用变换原点缩放 SVG 元素

java - Proguard keepclasseswithmembers : members isnt kept?

android - 为什么 ViewPager 高度 match_parent 不起作用?

android - Crashlytics 在初始化期间超时

jquery click for css image based hover?

php - Android从php org.json.JSONArray检索数据无法转换为JSONObject

database - 文件输入框上传图片到数据库

c - 在 C 中将浮点值缩放为 (0-100) 的函数

javascript - 根据浏览器窗口的时间和比例更改背景