2013-04-24 2 views
4

У меня есть галерея изображений разных размеров. Каждое изображение отображается внутри ImageView последовательно (через OnTouchListener). Мне нужно знать положение кадра изображения, в котором я показываю родственников, ImageView, но с тестами, которые я провел, я получил координаты ImageView. Есть идеи?Как получить положение изображения внутри ImageView?

enter image description here

мне нужны значения (x1, y1) и (x2, y2).

Заранее спасибо.

Это мой класс:

public class PuzzleView extends ImageView { 

protected Paint currentPaint;  

protected boolean drawRect = false;  
protected float left; 
protected float top; 
protected float right; 
protected float bottom; 

protected float pixelX; 
protected float pixelY; 

protected int nChunksX = 5; 
protected int nChunksY = 5; 

protected int currentWidth = 0; 
protected int currentHeight = 0; 

public PuzzleView(Context context, AttributeSet attrs) { 
    super(context, attrs); 

    currentPaint = new Paint(); 
    currentPaint.setDither(true); 
    currentPaint.setColor(0xFF00CC00); 
    currentPaint.setStyle(Paint.Style.STROKE); 
    currentPaint.setStrokeJoin(Paint.Join.ROUND); 
    currentPaint.setStrokeCap(Paint.Cap.ROUND); 
    currentPaint.setStrokeWidth(2);       
} 

@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 

    float chunkWidth = currentWidth/nChunksX; 
    float chunkHeight = currentHeight/nChunksY; 

    float posX = ((int)(pixelX/chunkWidth)) * chunkWidth; 
    float posY = ((int)(pixelY/chunkHeight)) * chunkHeight; 

    canvas.drawRect(posX, posY, posX + chunkWidth, posY + chunkHeight, currentPaint); 

    Rect rect = this.getDrawable().getBounds(); 
    canvas.drawRect(rect, currentPaint); 
} 

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 

    // Get image matrix values and place them in an array 
    float[] f = new float[9]; 
    getImageMatrix().getValues(f); 

    // Extract the scale values using the constants (if aspect ratio maintained, scaleX == scaleY) 
    final float scaleX = f[Matrix.MSCALE_X]; 
    final float scaleY = f[Matrix.MSCALE_Y]; 

    // Get the drawable (could also get the bitmap behind the drawable and getWidth/getHeight) 
    final Drawable d = getDrawable(); 
    final int origW = d.getIntrinsicWidth(); 
    final int origH = d.getIntrinsicHeight(); 

    // Calculate the actual dimensions 
    final int actW = Math.round(origW * scaleX); 
    final int actH = Math.round(origH * scaleY); 

    currentWidth = actW; 
    currentHeight = actH; 
} 

public boolean isDrawRect() { 
    return drawRect; 
} 

public void setDrawRect(boolean drawRect) { 
    this.drawRect = drawRect; 
} 

public float getLeftRect() { 
    return left; 
} 

public void setLeftRect(float left) { 
    this.left = left; 
} 

public float getTopRect() { 
    return top; 
} 

public void setTopRect(float top) { 
    this.top = top; 
} 

public float getRightRect() { 
    return right; 
} 

public void setRightRect(float right) { 
    this.right = right; 
} 

public float getBottomRect() { 
    return bottom; 
} 

public void setBottomRect(float bottom) { 
    this.bottom = bottom; 
} 

public float getPixelX() { 
    return pixelX; 
} 

public void setPixelX(float pixelX) { 
    this.pixelX = pixelX; 
} 

public float getPixelY() { 
    return pixelY; 
} 

public void setPixelY(float pixelY) { 
    this.pixelY = pixelY; 
} 

public int getChunksX() { 
    return nChunksX; 
} 

public void setChunksX(int nChunksX) { 
    this.nChunksX = nChunksX; 
} 

public int getChunksY() { 
    return nChunksY; 
} 

public void setChunksY(int nChunksY) {   
    this.nChunksY = nChunksY; 
} 
} 

В настоящем время, источник изображение определяется в файле XML:

<com.jocajica.shakepic.PuzzleView 
    android:id="@+id/imageViewSelected" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_centerHorizontal="true" 
    android:layout_centerVertical="true" 
    android:contentDescription="@string/image_selected" 
    android:src="@android:drawable/progress_indeterminate_horizontal" /> 

мне нужно нарисовать сетку над изображением.

+0

Что случилось с getTop/getLeft/getBottom/GetRight ? – Blackbelt

+0

@blackbelt Я верю, что они вернут координаты ImageView в его контейнере. OP хочет знать смещение фактического изображения в ImageView –

+0

Точно. Мне нужно знать смещение текущего изображения, и getTop/getLeft/getBottom/getRight возвращают только координаты ImageView в своем контейнере. –

ответ

8

По ссылке Якоба Nordfalk, я был в состоянии произвести статический метод позволяет получить положение изображения и размеры из ImageView.

/** 
* Returns the bitmap position inside an imageView. 
* @param imageView source ImageView 
* @return 0: left, 1: top, 2: width, 3: height 
*/ 
public static int[] getBitmapPositionInsideImageView(ImageView imageView) { 
    int[] ret = new int[4]; 

    if (imageView == null || imageView.getDrawable() == null) 
     return ret; 

    // Get image dimensions 
    // Get image matrix values and place them in an array 
    float[] f = new float[9]; 
    imageView.getImageMatrix().getValues(f); 

    // Extract the scale values using the constants (if aspect ratio maintained, scaleX == scaleY) 
    final float scaleX = f[Matrix.MSCALE_X]; 
    final float scaleY = f[Matrix.MSCALE_Y]; 

    // Get the drawable (could also get the bitmap behind the drawable and getWidth/getHeight) 
    final Drawable d = imageView.getDrawable(); 
    final int origW = d.getIntrinsicWidth(); 
    final int origH = d.getIntrinsicHeight(); 

    // Calculate the actual dimensions 
    final int actW = Math.round(origW * scaleX); 
    final int actH = Math.round(origH * scaleY); 

    ret[2] = actW; 
    ret[3] = actH; 

    // Get image position 
    // We assume that the image is centered into ImageView 
    int imgViewW = imageView.getWidth(); 
    int imgViewH = imageView.getHeight(); 

    int top = (int) (imgViewH - actH)/2; 
    int left = (int) (imgViewW - actW)/2; 

    ret[0] = left; 
    ret[1] = top; 

    return ret; 
} 
+0

Это приведет к смещениям в отрицательном значении. –

0

Override метод OnLayout

//inside puzzleView 
    float[] matrix = new float[9]; 
    @Override 
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) { 

     super.onLayout(changed, left, top, right, bottom); 
     matrix = getMatrix(); 

    }  
    public void getMatrix(){ 
     return matrix; 
    } 


    private float[] getMatrix() { 

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

     return matrix; 
    } 

и использовать это, чтобы получить значения

 // Extract the scale and translation values from the matrix. 
     float scaleX = matrix[Matrix.MSCALE_X]; 
     float scaleY = matrix[Matrix.MSCALE_Y]; 
     float transX = matrix[Matrix.MTRANS_X]; 
     float transY = matrix[Matrix.MTRANS_Y]; 

Я надеюсь, что эта помощь у

Смежные вопросы