2017-02-16 43 views
0

Я работаю над функцией выбора нескольких макетов в Android-приложении.Как получить верхнюю и левую координаты видимого растрового изображения внутри ImageView в android

Мое требование - получить верхнюю и левую координаты растрового изображения после увеличения и ущипнуть изображение.

Я использую функцию TouchImageView для увеличения и перемещения.

Я пробовал так много решений SO, но не получил решение моего требования.

первая попытка -

public static int[] getBitmapOffset(ImageView img, boolean includeLayout) { 
     int[] offset = new int[2]; 
     float[] values = new float[9]; 

     Matrix m = img.getImageMatrix(); 
     m.getValues(values); 

     offset[0] = (int) values[5]; 
     offset[1] = (int) values[2]; 

     if (includeLayout) { 
      ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) img.getLayoutParams(); 
      int paddingTop = (int) (img.getPaddingTop()); 
      int paddingLeft = (int) (img.getPaddingLeft()); 

      offset[0] += paddingTop + lp.topMargin; 
      offset[1] += paddingLeft + lp.leftMargin; 
     } 
     return offset; 
    } 

вторая попытка -

  Rect r = img.getDrawable().getBounds(); 

      int drawLeft = r.left; 
      int drawTop = r.top; 
      int drawRight = r.right; 
      int drawBottom = r.bottom; 

      Logger.logsInfo(TAG, "Focus drawLeft : " + i + " : " +drawLeft); 
      Logger.logsInfo(TAG, "Focus drawTop : " + i + " : " +drawTop); 
      Logger.logsInfo(TAG, "Focus drawRight : " + i + " : " +drawRight); 
      Logger.logsInfo(TAG, "Focus drawBottom : " + i + " : " +drawBottom); 

Пожалуйста, дайте мне знать, что я делаю неправильно, потому что я работаю над этим из последних 3-х дней и до сих пор не сделано ,

Спасибо заранее. Предложения действительно оценены.

+0

получить 'img.getDrawingCache() 'вы получите видимо. перед этим добавьте 'img.setDrawingCacheEnabled (true);' – Qamar

+0

В первой попытке вы попытались использовать 'Matrix.postScale (yourScaleFactor, yourScaleFactor)'? –

+0

Вы изменяете размер изображения по матрице. После того, как изображение 'postScale' получит новые координаты, я думаю, что matrix.mapRect поможет вам. Получите представление rect и карту с матрицей изображений, а затем слева укажите ваш ожидаемый x. – Qamar

ответ

0

Заканчивать getZoomedRect из TouchImageView

Добавить функцию и вернуться PointF topLeft = transformCoordTouchToBitmap(0, 0, true);

Метод подпись

private PointF transformCoordTouchToBitmap(float x, float y, boolean clipToBitmap) 

Передача clipToBitmap истинного среднее видимого Прямоугольник

/** 
    * Return a Rect representing the zoomed image. 
    * @return rect representing zoomed image 
    */ 
    public RectF getZoomedRect() { 
     if (mScaleType == ScaleType.FIT_XY) { 
      throw new UnsupportedOperationException("getZoomedRect() not supported with FIT_XY"); 
     } 
     PointF topLeft = transformCoordTouchToBitmap(0, 0, true); 
     PointF bottomRight = transformCoordTouchToBitmap(viewWidth, viewHeight, true); 

     float w = getDrawable().getIntrinsicWidth(); 
     float h = getDrawable().getIntrinsicHeight(); 
     return new RectF(topLeft.x/w, topLeft.y/h, bottomRight.x/w, bottomRight.y/h); 
    } 
+0

Спасибо за это, но я получаю это - RectF (0.90758044, 0.0, 0.9993077, 0.33333334) –

+0

А также как я могу перерисовать это изображение с помощью RectF? –

+0

Проверьте этот метод docs. Canvas.drawBitmap (Bitmap, Rect, RectF, Paint) – Qamar