【问题标题】:Getting coordinates and width/height from a matrix从矩阵中获取坐标和宽度/高度
【发布时间】:2011-03-12 23:04:58
【问题描述】:

我正在尝试为 Android 平台制作一个媒体播放器,我尝试添加的功能之一是能够拖动和缩放图片。

我遇到的问题是我从“Hello,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);

这段代码 sn-p 完全符合我的要求,但我需要纯 X、Y 坐标和图片的宽度/高度,而不是矩阵。

有谁知道如何将矩阵更改为 X、Y 坐标和宽度和高度?

【问题讨论】:

    标签: android


    【解决方案1】:

    原来解决方案很简单:

    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;
    

    【讨论】:

    • 迷人的解决方案...太棒了
    • 我只想补充一点,'imageWidth' 和 'imageHeight' 是绘制到 ImageView 后的可绘制对象的宽度和高度(固有值)。
    • 如何使用这个height&width来画canvas.drawBitmap(bitmap,height,width, null);我试过了但是没有画出准确的位置
    【解决方案2】:

    谢谢,我整晚都在寻找这个,只有一件事: 在我的示例中,我必须使用:

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

    获得正确的高度。

    【讨论】:

    • 我也是。 user489447 的另一个答案没有提供准确的值。
    【解决方案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;
        }
    

    :=)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 2017-02-28
      • 2012-05-22
      • 1970-01-01
      • 2022-01-08
      • 2017-12-26
      • 1970-01-01
      相关资源
      最近更新 更多