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