Как ограничить границу панорамирования изображения в Android imageView - PullRequest
2 голосов
/ 04 октября 2011

У меня есть imageView с мультитачем, ориентировочно основанный на этого урока .Один из комментаторов там собрал полусумный метод ограничения перетаскивания изображения до границ изображения, чтобы край изображения не мог перетаскиваться за его край.Этот метод работает, но не полностью.Он ограничивает перетаскивание только по двум краям.

Кто-нибудь знает менее грязный и действительно функциональный метод ограничения перетаскивания изображения?

Это очень важная концепция для разработки приложений для Android, которая не рассматривается должным образом....

Я думал о следующих идеях:

1) setScaleType (scaleType.fitXY), когда zoom = 1.0F (т. Е. Min zoom), и перетаскивание включено только при 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);

Ответы [ 2 ]

5 голосов
/ 26 ноября 2012
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);

3 голосов
/ 14 июля 2015

Я понимаю, что это довольно стар, но попробуйте это.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);
}
...