Я пытаюсь получить абсолютные пиксельные координаты экрана в верхнем левом углу вида. Тем не менее, все методы, которые я могу найти, такие как getLeft()
и getRight()
, не работают, так как все они кажутся относительными к родителю представления, что дает мне 0
. Как правильно это сделать?
Если это поможет, это для игры «верни картинку в порядок». Я хочу, чтобы пользователь мог нарисовать прямоугольник, чтобы выбрать несколько частей. Я предполагаю, что самый простой способ сделать это - getRawX()
и getRawY()
из MotionEvent
, а затем сравнить эти значения с верхним левым углом макета, содержащего фрагменты. Зная размер кусочков, я могу определить, сколько кусочков было выбрано. Я понимаю, что могу использовать getX()
и getY()
на MotionEvent
, но так как это возвращает относительную позицию, которая затрудняет определение, какие части были выбраны. (Знаю, не невозможно, но это кажется излишне сложным).
Редактировать: это код, который я использовал, чтобы попытаться получить размер контейнера для хранения, согласно одному из вопросов. TableLayout
- это стол, в котором хранятся все кусочки головоломки.
TableLayout tableLayout = (TableLayout) findViewById(R.id.tableLayout);
Log.d(LOG_TAG, "Values " + tableLayout.getTop() + tableLayout.getLeft());
Редактировать 2: Вот код, который я пробовал, следуя другим предложенным ответам.
public int[] tableLayoutCorners = new int[2];
(...)
TableLayout tableLayout = (TableLayout) findViewById(R.id.tableLayout);
tableLayout.requestLayout();
Rect corners = new Rect();
tableLayout.getLocalVisibleRect(corners);
Log.d(LOG_TAG, "Top left " + corners.top + ", " + corners.left + ", " + corners.right
+ ", " + corners.bottom);
cells[4].getLocationOnScreen(tableLayoutCorners);
Log.d(LOG_TAG, "Values " + tableLayoutCorners[0] + ", " + tableLayoutCorners[1]);
Этот код был добавлен после завершения инициализации. Изображение было разделено на массив ImageViews (массив cell []), содержащийся в TableLayout
. Ячейки [0] - это верхний левый ImageView
, и я выбрал ячейки [4], так как они где-то посередине и, безусловно, не должны иметь координат (0,0).
Код, показанный выше, все еще дает мне все 0 в журналах, которые я действительно не понимаю, потому что различные части головоломки отображаются правильно. (Я попробовал public int для tableLayoutCorners и видимости по умолчанию, оба дали одинаковый результат.)
Не знаю, значимо ли это, но ImageView
изначально не имеют размера. Размер ImageView
s определяется во время инициализации автоматически при просмотре, когда я даю ему изображение для отображения. Может ли это способствовать тому, что их значения будут равны 0, даже если этот код регистрации будет после того, как они получили изображение и автоматически изменили размеры сами? Чтобы потенциально противостоять этому, я добавил код tableLayout.requestLayout()
, как показано выше, но это не помогло.