2013-11-26 43 views
0

调整后,我想用这个代码,我从网上找来的,以获得缩放的ImageView的宽度和高度:获取的ImageView的宽度和高度,使用矩阵

public class MultiTouch extends Activity implements OnTouchListener { 

// these matrices will be used to move and zoom image 
private Matrix matrix = new Matrix(); 
private Matrix savedMatrix = new Matrix(); 
// we can be in one of these 3 states 
private static final int NONE = 0; 
private static final int DRAG = 1; 
private static final int ZOOM = 2; 
private int mode = NONE; 
// remember some things for zooming 
private PointF start = new PointF(); 
private PointF mid = new PointF(); 
private float oldDist = 1f; 
private float d = 0f; 
private float newRot = 0f; 
private float[] lastEvent = null; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    ImageView view = (ImageView) findViewById(R.id.imageView); 
    view.setOnTouchListener(this); 
} 

public boolean onTouch(View v, MotionEvent event) { 
    // handle touch events here 
    ImageView view = (ImageView) v; 

    switch (event.getAction() & MotionEvent.ACTION_MASK) { 
     case MotionEvent.ACTION_DOWN: 
      savedMatrix.set(matrix); 
      start.set(event.getX(), event.getY()); 
      mode = DRAG; 
      lastEvent = null; 
      break; 
     case MotionEvent.ACTION_POINTER_DOWN: 
      oldDist = spacing(event); 
      if (oldDist > 10f) { 
       savedMatrix.set(matrix); 
       midPoint(mid, event); 
       mode = ZOOM; 
      } 
      lastEvent = new float[4]; 
      lastEvent[0] = event.getX(0); 
      lastEvent[1] = event.getX(1); 
      lastEvent[2] = event.getY(0); 
      lastEvent[3] = event.getY(1); 
      d = rotation(event); 
      break; 
     case MotionEvent.ACTION_UP: 
     case MotionEvent.ACTION_POINTER_UP: 
      mode = NONE; 
      lastEvent = null; 
      break; 
     case MotionEvent.ACTION_MOVE: 
      if (mode == DRAG) { 
       matrix.set(savedMatrix); 
       float dx = event.getX() - start.x; 
       float dy = event.getY() - start.y; 
       matrix.postTranslate(dx, dy); 
      } else if (mode == ZOOM) { 
       float newDist = spacing(event); 
       if (newDist > 10f) { 
        matrix.set(savedMatrix); 
        float scale = (newDist/oldDist); 
        matrix.postScale(scale, scale, mid.x, mid.y); 
       } 
       if (lastEvent != null && event.getPointerCount() == 3) { 
        newRot = rotation(event); 
        float r = newRot - d; 
        float[] values = new float[9]; 
        matrix.getValues(values); 
        float tx = values[2]; 
        float ty = values[5]; 
        float sx = values[0]; 
        float xc = (view.getWidth()/2) * sx; 
        float yc = (view.getHeight()/2) * sx; 
        matrix.postRotate(r, tx + xc, ty + yc); 
       } 
      } 
      break; 
    } 

    view.setImageMatrix(matrix); 
    return true; 
} 

/** 
* Determine the space between the first two fingers 
*/ 
private float spacing(MotionEvent event) { 
    float x = event.getX(0) - event.getX(1); 
    float y = event.getY(0) - event.getY(1); 
    return FloatMath.sqrt(x * x + y * y); 
} 

/** 
* Calculate the mid point of the first two fingers 
*/ 
private void midPoint(PointF point, MotionEvent event) { 
    float x = event.getX(0) + event.getX(1); 
    float y = event.getY(0) + event.getY(1); 
    point.set(x/2, y/2); 
} 

/** 
* Calculate the degree to be rotated by. 
* 
* @param event 
* @return Degrees 
*/ 
private float rotation(MotionEvent event) { 
    double delta_x = (event.getX(0) - event.getX(1)); 
    double delta_y = (event.getY(0) - event.getY(1)); 
    double radians = Math.atan2(delta_y, delta_x); 
    return (float) Math.toDegrees(radians); 
} 

}

我的问题是如果我的原始图像视图小于缩放图像,图像显示,但与我的imageview的原始大小。这是图像缩放的部分:

    if (newDist > 10f) { 
        matrix.set(savedMatrix); 
        float scale = (newDist/oldDist); 
        matrix.postScale(scale, scale, mid.x, mid.y); 
       } 

我还想调整我的imageview容器大小。

这是实际发生的情况。左侧图像是原始图像,右侧图像是实际结果。我希望imageview容器的缩放图像大小相同。

enter image description here

+0

你跟我说过吗? x在你的imageview布局中的高度和宽度? – Subbu

+0

默认情况下,我的imageview大小为100x100 – MMakati

回答

0

使用WrapContent为双方HeightWidthImageView

0

您可以通过调用

float[] matrixValues = new float[9]; 
yourMatrix.getValues(matrixValues); 
float scaleX = matrixValues[Matrix.MSCALE_X]; 
float scaleY = matrixValues[Matrix.MSCALE_Y]; 

,然后通过适当的值你的主要宽度和高度相乘得到的矩阵比例因子