2012-03-25 3 views
6

У меня есть несколько представлений в FrameLayout. Существует переход, который я написал, где каждый вид имеет пользовательский класс анимации. Во время этого перехода мне нужно довести представление в нижней части z-порядка до фронта. Я делаю это с:Android View.bringToFront() вызывает мерцание

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() вызовы недействительными() и requestLayout() на материнской FrameLayout и всех его детей.

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

Я нацеливание Уровень API 7.

ответ

1

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

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

+0

Извините, я обновил свой вопрос, чтобы уточнить. Я уже делаю, как вы говорите; putBackAtFront() вызывается только один раз в конце перехода, а не каждый раз. –

0

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

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

setLayerType(LAYER_TYPE_SOFTWARE, null); 

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

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

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

+0

Спасибо за предложения. Как указано в вопросе, я нацелен на API 7 (2.1), поэтому ускорение HW для меня не является вариантом. requestFocus() не изменит порядок z, который мне нужно выполнить. Также, как указано в вопросе, который я пробовал с помощью requestLayout() и без него, и invalidate(). В любом случае, bringToFront() вызывается в потоке пользовательского интерфейса (main), поэтому это - согласно документам - должно по определению «приостанавливать» чертеж. Если документы не рассказывают всю историю, и происходит некоторое асинхронное рендеринг. –

Смежные вопросы