2013-11-26 47 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]; 

,然後通過適當的值你的主要寬度和高度相乘得到的矩陣比例因子