Другим способом решения, опубликованного @knickedi, является использование ObjectAnimator вместо Runnable. Идея состоит в том, чтобы использовать ObjectAnimator для регулировки веса левого и правого представлений. Однако представления должны быть настроены так, чтобы вес можно было выставить как свойство для анимации ObjectAnimator.
Итак, сначала определите настроенное представление (на примере LinearLayout):
public class CustomLinearLayout extends LinearLayout {
public CustomLinearLayout(Context context) {
super(context);
}
public CustomLinearLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomLinearLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public void setMyWeight(float value) {
LinearLayout.LayoutParams p = (LinearLayout.LayoutParams)getLayoutParams();
p.weight = value;
requestLayout();
}
}
Затем обновите XML макета, чтобы использовать этот пользовательский линейный макет.
Затем, когда вам нужно переключить анимацию, используйте ObjectAnimator:
ObjectAnimator rightView = ObjectAnimator.ofFloat(viewgroup_right, "MyWeight", 0.5f, 1.0f);
ObjectAnimator leftView = ObjectAnimator.ofFloat(viewgroup_left, "MyWeight", 0.5f, 0.0f);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.setDuration(1000); // 1 second of animation
animatorSet.playTogether(rightView, leftView);
animatorSet.start();
В приведенном выше коде предполагается, что оба вида имеют линейную компоновку и имеют половину веса для начала. Анимация расширит правый вид до полного веса (поэтому левый будет скрыт). Обратите внимание, что ObjectAnimator анимируется с помощью свойства «MyWeight» настроенного линейного макета. AnimatorSet используется для связывания левого и правого ObjectAnimators вместе, поэтому анимация выглядит плавно.
Такой подход уменьшает необходимость в написании исполняемого кода и вычислении веса внутри него, но для него требуется определенный класс.