Могу ли я скрыть элемент управления Android с анимацией? - PullRequest
2 голосов
/ 08 декабря 2011

У меня есть представление Android, которое включает RadioGroup с тремя RadioButton-кнопками. Когда выбрана одна из кнопок RadioButton, пользователь также должен ввести текст в элемент управления EditText. Если выбрана любая из двух других радиокнопок, эта дополнительная информация не требуется.

В настоящее время я использую OnCheckedChangedListener для RadioGroup, чтобы определить, когда проверяется новый RadioButton, и скрываю EditText, устанавливая его видимость View.GONE. Однако это немного раздражает, и мне интересно, есть ли способ, которым я вообще мог бы оживить переход. Возможно ли это, и если да, то каков ключ к началу работы?

Ответы [ 2 ]

1 голос
/ 09 декабря 2011

Я нашел следующее работоспособное решение, основанное на коде, который я нашел в http://tech.chitgoks.com/2011/10/29/android-animation-to-expand-collapse-view-its-children/

В своей деятельности:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.edit_account);
    companyGroup.setOnCheckedChangeListener(new OnCheckedChangeListener()
    {
        @Override
        public void onCheckedChanged(RadioGroup group, int checkedId)
        {
            if (checkedId == R.id.companyRadio)
                EDNUtils.expandCollapse(companyNameText, true, 500);
            else
                EDNUtils.expandCollapse(companyNameText, false, 500);
        }
    });
}

Реализация из EDNUtils:

public static Animation expandCollapse(final View v, final boolean expand) 
{       
    return expandCollapse(v, expand, 1000);
}

public static Animation expandCollapse(final View v, final boolean expand, final int duration) 
{
    int currentHeight = v.getLayoutParams().height;
    v.measure(MeasureSpec.makeMeasureSpec(((View)v.getParent()).getMeasuredWidth(), MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
    final int initialHeight = v.getMeasuredHeight();

    if ((expand && currentHeight == initialHeight) || (!expand && currentHeight == 0))
        return null;

    if (expand) 
        v.getLayoutParams().height = 0;
    else 
        v.getLayoutParams().height = initialHeight;
    v.setVisibility(View.VISIBLE);

    Animation a = new Animation() 
    {
        @Override
        protected void applyTransformation(float interpolatedTime, Transformation t) 
        {
            int newHeight = 0;
            if (expand) 
                newHeight = (int) (initialHeight * interpolatedTime);
            else 
                newHeight = (int) (initialHeight * (1 - interpolatedTime));
            v.getLayoutParams().height = newHeight;            
            v.requestLayout();

            if (interpolatedTime == 1 && !expand)
                v.setVisibility(View.GONE);
        }

        @Override
        public boolean willChangeBounds()  
        {
            return true;
        }
    };
    a.setDuration(duration);
    v.startAnimation(a);
    return a;
}
1 голос
/ 08 декабря 2011

Поскольку вы используете API уровня 7, ответ LayoutTransition больше не применяется.

См. Статью: Как установить альфа-значение всего представления в API-уровне 7 (Android 2.1)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...