Android View.bringToFront () вызывает мерцание - PullRequest
6 голосов
/ 25 марта 2012

У меня есть несколько видов внутри FrameLayout. Я написал переход, в котором к каждому представлению применяется пользовательский класс Animation. Во время этого перехода мне нужно вывести вид внизу z-порядка вперед. Я делаю это с:

    public static void putBackAtFront(ViewGroup v) 
    {
        v.getChildAt(0).bringToFront();
        refreshEverything(v);
    }

Это вызывается из applyTransformation () моей пользовательской анимации.

т.е.

public class PivotAnimation extends Animation {
    private View view;
    ...
    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) 
    {
        ...
        if(interpolatedTime >= 1.f && isAtBack(view))
        {
           putBackAtFront(view);
        }
        ...
    }
    ...
}

refreshEverything () вызывает invalidate () и requestLayout () для родительского FrameLayout и всех его дочерних элементов.

Все работает отлично, за исключением того, что при вызове метода putBackAtFront () представление, находящееся сейчас внизу, исчезает на один кадр, а затем мгновенно появляется снова, что приводит к заметному мерцанию. Я также пытался без вызова refreshEverything (), это не имеет значения.

Я нацеливаюсь на уровень API 7.

Ответы [ 2 ]

1 голос
/ 02 апреля 2012

applyTransformation () вызывается несколько раз во время анимации, поэтому вы должны делать анимацию на основе interpolatedTime, когда его значение равно 1,0, анимация заканчивается, поэтому вы должны вызвать здесь ваш вывод вперед.

Так что, на мой взгляд, это мерцание происходит, когда при некоторых из этих вызовов вашего метода getChildAt (0) получает представление, отличное от того, которое вы хотите, и появляется мерцание.

0 голосов
/ 05 апреля 2012

Я думаю, это должно быть одно из трех:

Если вы работаете с API 3.0+, возможно, у вас включено аппаратное ускорение. Это также включено по умолчанию в 4.0. Вы можете попробовать использовать

    setLayerType(LAYER_TYPE_SOFTWARE, null);

чтобы отключить ускорение HW для этого макета / вида / окна.

Кроме того, вам может не потребоваться вызывать requestLayout () , если все представления являются дочерними по отношению к относительному планированию, изменение z-индекса не должно касаться этого.

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

...