Android: как скрыть, а затем показать просмотр с эффектом анимации?

У меня есть похожий вопрос: Обновить макет с анимацией

В основном: у меня есть одно вертикальное представление LinearLayout с текстом редактирования, кнопкой и затем списком. Я бы хотел скрыть текст выхода после нажатия кнопки, чтобы освободить место для списка (кнопка поднимется). При втором нажатии снова должен быть виден текст редактирования. Edittext и кнопка имеют высоту wrap_content.

Я хочу скрыть и показать edittext с анимацией.

Мне удалось анимировать сокрытие, перегрузив Animation applyTransformation:

final float edittextheight= edittext.getHeight();
[....]
@Override
protected void applyTransformation(float interpolatedTime,
        Transformation t)
{
    super.applyTransformation(interpolatedTime, t);
    android.view.ViewGroup.LayoutParams lp = edittext.getLayoutParams();
    lp.height = (int)(edittextheight*(1.0-interpolatedTime));
    edittext.setLayoutParams(lp);
}

Проблема:

Я не знаю, как рассчитать высоту для анимации показа - edittext.getHeight (); возвращает 0, когда виджет скрыт, а в определении макета я использую "wrap_content".

Помощь?


person tomash    schedule 22.03.2010    source источник


Ответы (2)


Вы не можете получить высоту edittext, пока действие не завершит его рисование. Таким образом, вы можете получить его, добавив onpredrawListner в свой текст редактирования.

ViewTreeObserver treeObserver = edittext.getViewTreeObserver();
treeObserver.addOnPreDrawListener(new OnPreDrawListener() {
    public boolean onPreDraw() {
            int height = edittext.getHeight();
            ViewTreeObserver removeTreeObserver = edittext.getViewTreeObserver();
     removeTreeObserver.removeOnPreDrawListener(this);
          }
}

Теперь у вас есть высота, примените любую анимацию, какую захотите.

person RiksAndroid    schedule 24.08.2011
comment
С моей точки зрения, это слишком сложно. То же самое можно сделать, выполнив view.post(runnable);. Внутри runnable у вас есть доступ к высоте элемента. - person Macarse; 23.11.2011

Не могли бы вы кэшировать высоту EditText? Другими словами, сохраните его высоту (с помощью getHeight ()) в int, когда вы его скрываете, что вы можете позже прочитать, даже когда сам виджет больше не отображается.

Однако я подозреваю, что вы также столкнулись с аналогичной проблемой, с которой я столкнулся, описанной в этом вопрос. По сути, вы не можете получить высоту View до тех пор, пока onCreate, onStart и onPause не завершат все, потому что до этого действие еще не закончило рисование на экране. Хороший способ узнать, что процесс макета завершен, прежде чем вы попытаетесь получить его высоту, - это просто получить высоту в вашей кнопке ClickListener; вы просто не можете нажать кнопку, пока макет не будет завершен, поэтому расчет высоты будет завершен.

person Steve Haley    schedule 22.03.2010
comment
Проблема с сохранением высоты как фиксированного значения заключается в том, что после того, как она снова станет видимой, она будет иметь фиксированную высоту и может не предоставить достаточно места для ввода. - person banzai86; 24.10.2011