2011-03-12 61 views
11

我試圖製作Android平臺的媒體播放器,我試圖添加的功能之一是拖拽縮放圖片的功能。從矩陣獲取座標和寬度/高度

我遇到的問題是我從「你好,Android」編輯複製此代碼。 3:

@Override 
public boolean onTouch(View v, MotionEvent event) { 
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; 
    break; 
case MotionEvent.ACTION_POINTER_DOWN: 
    oldDist = spacing(event); 
    if (oldDist > 10f) { 
     savedMatrix.set(matrix); 
     midPoint(mid, event); 
     mode = ZOOM; 
    } 
    break; 
case MotionEvent.ACTION_UP: 
case MotionEvent.ACTION_POINTER_UP: 
    mode = NONE; 
    break; 
case MotionEvent.ACTION_MOVE: 
    if (mode == DRAG) { 
     matrix.set(savedMatrix); 
     matrix.postTranslate(event.getX() - start.x, event.getY() - start.y); 
    } 
    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); 
     } 
    } 
    break; 
} 
view.setImageMatrix(matrix); 

這段代碼不正是我想要的,但我需要純粹的X,Y座標和圖像,而不是矩陣的寬度/高度。

有誰知道如何將矩陣更改爲X,Y座標和寬度和高度?

回答

36

原來,解決方案很簡單:

float[] values = new float[9]; 
matrix.getValues(values); 
globalX = values[Matrix.MTRANS_X]; 
globalY = values[Matrix.MTRANS_Y]; 
width = values[Matrix.MSCALE_X]*imageWidth; 
height = values[Matrix.MSCALE_Y]*imageHeight; 
+0

感謝日誌的人! :) – cV2 2012-02-09 16:30:06

+0

迷人的解決方案...偉大的 – 2014-04-04 13:36:10

+1

我只是想補充'圖像寬度'和'圖像高度'是可繪製的寬度和高度後,它已被繪製到ImageView(內部值)。 – 2015-02-17 08:25:43

4

感謝,我一直在尋找了一整夜找到這一點,只有一兩件事: 在我的例子,我不得不使用:

float height = matrixValues[4]*((ImageView)currentView).getDrawable().getIntrinsicHeight(); 

以獲得正確的高度。

+1

我也是。 user489447的其他答案不提供準確的值。 – 2012-02-02 00:30:38

3

我寫了一些方法可以幫助一些用戶(非常感謝上面的代碼!):

private void logImageViewMatrixInfos(Matrix matrix, ImageView imageView) { 
     float[] values = new float[9]; 
      matrix.getValues(values); 
      float globalX = values[2]; 
      float globalY = values[5]; 
      float width = values[0]* imageView.getWidth(); 
      float height = values[4] * imageView.getHeight(); 

      Log.i("Log value", "Image Details: xPos: " + globalX + " yPos: " + globalY + "\nwidth: " + width + " height: " + height); 
    } 

    private float getXValueFromMatrix(Matrix matrix) { 

     float[] values = new float[9]; 
      matrix.getValues(values); 
      float globalX = values[2]; 

      return globalX; 
    } 

    private float getYValueFromMatrix(Matrix matrix) { 

     float[] values = new float[9]; 
      matrix.getValues(values); 
      float globalY = values[5]; 

      return globalY; 
    } 

    private float getWidthFromMatrix(Matrix matrix, ImageView imageview) { 

     float[] values = new float[9]; 
      matrix.getValues(values); 

      float width = values[0]* imageview.getWidth(); 

      return width; 
    } 

    private float getHeightFromMatrix(Matrix matrix, ImageView imageview) { 

     float[] values = new float[9]; 
      matrix.getValues(values); 

      float height = values[4] * imageview.getHeight(); 

      return height; 
    } 

:=)