Пользовательский вид: сообщите детям, что у родителя другой размер

У меня есть собственное представление (ViewGroup), которое будет анимировано от ширины = 0dp до ширины = 300dp. Я хочу манипулировать холстом после того, как его дети были нарисованы. Для этого я переопределяю dispatchDraw(Canvas). Однако я хочу, чтобы дети отображались на холсте с разрешением 300 dp, даже если размер пользовательского представления меньше. При передаче большего холста методу dispatchDraw(Canvas) дочерние элементы не меняют свое положение и размер.

Мой вопрос: как я могу «подделать» большую ширину моей группы просмотра, чтобы дети отображались на большей поверхности?

С уважением, Роберт


person Basic Coder    schedule 07.07.2013    source источник


Ответы (1)


Каждый раз, когда представлению (включая ViewGroups) необходимо отрисовать себя, вызывается метод onMeasure, чтобы получить его размеры. После этого вызывается onLayout, чтобы получить позицию, где будет рисоваться. Этого не происходит в методах рисования, поскольку они вызываются после onMeasure и onLayout, см. здесь. Подводя итог, onMeasure вычисляет размеры, onLayout устанавливает позиции и, наконец, onDraw выполняет рендеринг. Поэтому лучше всего использовать onMeasure для установки желаемых размеров. Например, это метод onMeasure, который сообщает дочернему представлению, что его размеры должны быть ровно 300 x 150 пикселей:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int widthSpec;
    int heightSpec;

    widthSpec = MeasureSpec.makeMeasureSpec(300, MeasureSpec.EXACTLY);
    heightSpec = MeasureSpec.makeMeasureSpec(150, MeasureSpec.EXACTLY);

    llTopBar.measure(widthSpec, heightSpec); //<-- llTopBar is the child...

    super.onMeasure(widthMeasureSpec, heightMeasureSpec); //<--This is important
}

Если вы хотите использовать провалы вместо пикселей, вам нужно преобразовать их, см. здесь< /а>.

Вы можете измерить дочерние элементы с размерами, превышающими доступное пространство, но результаты могут быть не такими, как вы ожидаете, из-за отсечения или других факторов (например, если ваша ViewGroup находится в другой ViewGroup).

Из вашего вопроса я вижу, что вы создаете что-то, что скользит слева направо, возможно, исходный код раздвижного ящика будет полезен, посмотрите здесь.

Надеюсь это поможет...

person ChD Computers    schedule 08.07.2013