ImageView Pinch-zoom Scale Limits and pan bounds

前端 未结 4 1154
心在旅途
心在旅途 2020-12-14 23:03

I wanted to create a gallery with images. The images within the gallery should be zoomable and pannable. I could able to pinch-zoom an image but could not able to set zoom l

相关标签:
4条回答
  • 2020-12-14 23:31

    You can set zoom limit by adding these lines to ACTION_MOVE, mode == ZOOM:

    float[] f = new float[9];
    matrix.getValues(f);
    
    float scaleX = f[Matrix.MSCALE_X];
    float scaleY = f[Matrix.MSCALE_Y];
    if (scaleX > MAX_SCALE || scaleY > MAX_SCALE) return true;
    

    Similarly, add lines to ACTION_MOVE, mode == DRAG that takes into account the original location of your image, the translated length, and then compare them to the bounds.

    0 讨论(0)
  • 2020-12-14 23:31

    I provided an answer here that adds panning, zoom, and boundary detection to ImageView.

    0 讨论(0)
  • 2020-12-14 23:35

    Have tried using this code below and although it works I found that it was causing small incremental values to accumulate in Trans X and Trans Y leading to the picture slowly moving off screen.

    if(scaleX <= 0.7f)
                matrix.postScale((0.7f)/scaleX, (0.7f)/scaleY, mid.x, mid.y);
        else if(scaleX >= 2.5f) 
                matrix.postScale((2.5f)/scaleX, (2.5f)/scaleY, mid.x, mid.y);
    

    I fixed this be storing an original matrix in a float[] (1,0,0,0,1,0,0,0,1) and resetting the matrix back to these values whenever scaleX < 1. Hope this helps someone else one day :)

    if(scaleX <= 1.0f) {                                   
        float[] originalmatrixvalues = new float[] {1f, 0f, 0f, 0f, 1f, 0f, 0f, 0f, 1f};
        matrix.setValues(originalmatrixvalues); 
    } else if(scaleX >= 2.5f) {
        matrix.postScale((2.5f)/scaleX, (2.5f)/scaleY, mid.x, mid.y);
    }
    
    0 讨论(0)
  • 2020-12-14 23:51

    This fixed the zoom-limit problem for me. After the image is zoomed in/out to the limit, it just stops going further. It's also smooth and there are no lags. 0.7 and 2.0 are the minimum and maximum zoom levels.

    ....
    } else if (mode == ZOOM) {
        float[] f = new float[9];
    
        float newDist = spacing(event);
        if (newDist > 10f) {
                matrix.set(savedMatrix);
                float tScale = newDist / dist;
                matrix.postScale(tScale, tScale, mid.x, mid.y);
        }
    
        matrix.getValues(f);
        float scaleX = f[Matrix.MSCALE_X];
        float scaleY = f[Matrix.MSCALE_Y];
    
        if(scaleX <= 0.7f) {
                matrix.postScale((0.7f)/scaleX, (0.7f)/scaleY, mid.x, mid.y);
        } else if(scaleX >= 2.5f) {
                matrix.postScale((2.5f)/scaleX, (2.5f)/scaleY, mid.x, mid.y);
        }
    }
    ....        
    
    0 讨论(0)
提交回复
热议问题