Как получить прямоугольник Drawable of ImageView на Android? - PullRequest
5 голосов
/ 24 января 2012

Я хочу получить объект прямоугольника, который обернет Drawable объекта ImageView вместо прямоугольника, который обернет ImageView. Я буду использовать этот прямоугольник, чтобы нарисовать причудливый прямоугольник вокруг Drawable. Как я могу получить этот прямоугольник?

Ответы [ 6 ]

4 голосов
/ 24 января 2012
    Rect rect = new Rect();
    ImageView iV = new ImageView();

    rect.left = iV.getLeft();
    rect.top = iV.getTop();
    rect.bottom = iV.getBottom();
    rect.right = iV.getRight();

Теперь у вас есть прямоугольник.

0 голосов
/ 25 июня 2019

Я знаю, что это старый вопрос, но если кому-то это все еще нужно.

, насколько я понимаю, вы пытаетесь получить блокирующий прямоугольник следующим образом: blocking rectangle

Если вы пытаетесь получить Rect после отрисовки ImageView в макете, вы можете вызвать метод View.getHitRect (Rect) , который даст вам блокирующий Rect Drawable внутри представления изображения.

val rect = Rect()
view.getHitRect(rect)
0 голосов
/ 13 ноября 2018

Вы можете использовать getImageMatrix () См .: Android, как получить границы изображения с помощью матрицы

Rect bounds = imageView.getDrawable().getBounds(); 
RectF boundsF = new RectF(bounds); 
imageView.getImageMatrix().mapRect(boundsF); 
boundsF.round(bounds); 
0 голосов
/ 26 мая 2014

Зависит от типа масштаба, к которому относится изображение, и вы должны сделать обратный инжиниринг над методом "configureBounds ()" класса ImageView (http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.4.2_r1/android/widget/ImageView.java#ImageView.configureBounds%28%29).

например, я, когда мне нужно положение изображения для типа центральной шкалы (я думаю, что это проще, чем другие, потому что представление изображения не масштабирует изображение) Я делаю обратное:

(mDrawMatrix.setTranslate((int) ((vwidth - dwidth) * 0.5f + 0.5f),
                         (int) ((vheight - dheight) * 0.5f + 0.5f));)

    ImageView iv (Your ImageView);
    Drawable dw = iv.getDrawable();

    int dwidth = dw.getIntrinsicWidth();
    int dheight = dw.getIntrinsicHeight();

    int vwidth = iv.getWidth() - iv.getPaddingLeft() - iv.getPaddingRight();
    int vheight = iv.getHeight() - iv.getPaddingTop() - iv.getPaddingBottom();

    int realImageWidth = (int)((vwidth - dwidth) * 0.25f); 
    // (I do not know why I had to put 0.25f instead of 0.5f, 
    // but I think this issue is a consequence of the screen density)

    int realImageHeight = (int)((vheight - dheight) * 0.25f);

И с этими данными вы сможете создать прямоугольник, я знаю, что это немного сложно, но это работает для меня.

0 голосов
/ 28 января 2012

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

Допустим, у ImageView нет отступов, а гравитация установлена ​​по центру.Проблема в том, что вы не можете просто использовать ширину и высоту Drawable для вычисления положения прямоугольника, так как он может быть изменен в соответствии с ImageView.Таким образом, вы должны использовать размеры ImageView и соотношение ImageView и Drawable.

Когда соотношение Drawable и ImageView равно, Drawable полностью заполняет ImageView, а затем прямоугольник соответствует размерам ImageView.Координаты прямоугольника (в верхнем левом углу, в обратном направлении): (0/0), (ширина ImageView / 0), (ширина ImageView, высота ImageView), (0 / высота ImageView),

Если соотношения не совпадают и, скажем, например, Drawable шире, чем ImageView, то Drawable заполнит всю ширину ImageView, но не заполнит высоту.Но так как Drawable становится центрированным, мы можем вычислить координату y левого верхнего угла Drawables и, следовательно, для прямоугольника.Сначала вычислите текущую высоту Drawable в ImageView.Это должно быть сделано, поскольку Drawable не имеет своих исходных размеров, поскольку он был изменен в соответствии с ImageView.

current height Drawable = (Drawable height / Drawable width) * ImageView width

y значение координаты левого верхнего угла:

y = (ImageView height - Drawable current height) / 2 

Итак, координаты прямоугольника (из левого верхнего угла в обратном направлении): (0 /y), (ширина ImageView / y), (ширина ImageView / y + текущая высота Drawable), (0 / y + текущая высота Drawable)

Надеюсь, вы поняли идею.Если Drawable выше, чем ImageView, вы можете рассчитать его таким же образом, но должны поменять значения ширины и высоты.

0 голосов
/ 24 января 2012

просто преобразуйте рисованный объект в растровый объект:

Bitmap bmp = ((BitmapDrawable)dr).getBitmap();
int w = bmp.getWidth();
int h = bmp.getHeight();
...