如何避免缩放ImageView被拖出屏幕?

时间:2015-12-08 11:02:23

标签: android

我有一个ImageView Drawable可以放大或缩小。可以在Drawable内拖动ImageView,但可以将其拖出屏幕,以便例如Drawable的左边框可以放在屏幕的中心。我尝试了Benito Bertoli给出的solution,它完美适用于未缩放的初始图像。如何在缩放图像时使用此解决方案?

1 个答案:

答案 0 :(得分:0)

我这样做:

if (event.getAction()==MotionEvent.ACTION_POINTER_UP || event.getAction()==MotionEvent.ACTION_UP) {
        float[] matrixValues=new float[9];
        matrix.getValues(matrixValues);
        PointF coordenadas = validatePosition(matrixValues);
        if (coordenadas.x!=0 || coordenadas.y!=0){
            matrix.postTranslate(coordenadas.x,coordenadas.y);
            //view is a imageView
            view.setImageMatrix(matrix);
        }
}

这是方法:

private PointF validatePosition(float[] matrixValues){
    SizeF pantalla=getDisplaySize();
    SizeF zoomed=getImagenZoomSize(matrixValues[Matrix.MSCALE_X],matrixValues[Matrix.MSCALE_Y]);
    //System.out.println("M_TRANS: "+matrixValues[Matrix.M TRANS_X]+","+matrixValues[Matrix.M TRANS_Y]+"  Pantalla:"+pantalla.getWidth()+","+pantalla.getHeight()+"   Imagen:"+zoomed.getWidth()+","+zoomed.getHeight());
    PointF respuesta=new PointF(0,0);
    respuesta.set(calculateAbsolutePosition(matrixValues[Matrix.MTRANS_X],zoomed.getWidth(),pantalla.getWidth()),respuesta.y);
    respuesta.set(respuesta.x,calculateAbsolutePosition(matrixValues[Matrix.MTRANS_Y],zoomed.getHeight(),pantalla.getHeight()));
    return respuesta;
}

private SizeF getDisplaySize(){
    Point dimension=new Point();
    Display display=getWindowManager().getDefaultDisplay();
    display.getSize(dimension);
    pantalla=new SizeF(dimension.x,dimension.y);
    return pantalla;
}

private SizeF getImagenZoomSize(float scaleX, float scaleY){
    SizeF original=getOriginalImageSize();
    return new SizeF(original.getWidth()*scaleX,original.getHeight()*scaleY);
}

private float calculateAbsolutePosition(float actual, float medidaImagen, float medidaPantalla){
    float max, min;
    float desplazamiento;
    if (medidaPantalla>medidaImagen){
        max=(medidaPantalla-medidaImagen)/2;
        min=max;
    }
    else{
        max=0;
        min=medidaPantalla-medidaImagen;
    }
    if (actual<min){
        desplazamiento=-actual+min;
    }
    else if (actual>max){
        desplazamiento=-actual+max;
    }
    else{ //no movemos la imagen (desplazamiento=0)
        desplazamiento=0;
    }
    return desplazamiento;
}