Intereting Posts
Как обработчик влияет на способ вызова onReceiveResult (ResultReceiver)? В чем разница между паролем хранилища ключей и паролем ключей в Android Sign Certification? Как добавить прокручиваемый заголовок в gridview в Android? Использование службы Google Play Services LocationClient в фоновом режиме Удаление папки на SD-карте Указанная ориентация не указана, а по умолчанию – горизонтальная. Это общий источник ошибок, когда дети добавляются динамически Использование вложенного фрагмента и объекта аниматора рядом Как обнаружить, что уже обнаруженное и сопряженное устройство доступно? Восстановить ActionMode после изменения ориентации Как Android Studio знает о новых версиях зависимостей? Eclipse Android: не удалось открыть выбранный порт отладки VM (8700) Слишком много записей в журнале снижает производительность приложений Android? Android x86 виртуальная камера + камера Использование JavaCV и Realm вместе вызывает «java.lang.UnsatisfiedLinkError» Таблицы ширины 100% не работают в Gmail Android

В любом случае, чтобы программно изменить макет весового свойства линейного макета

У меня два вида в линейном макете, я программно меняю их свойство layout_weight. Есть ли способ, который я мог бы оживить это изменение веса, поэтому, когда вес изменен, изображения скользят к новому размеру?

Solutions Collecting From Web of "В любом случае, чтобы программно изменить макет весового свойства линейного макета"

Вы можете просто использовать ObjectAnimator.

ObjectAnimator anim = ObjectAnimator.ofFloat( viewToAnimate, "weight", startValue, endValue); anim.setDuration(2500); anim.start(); 

Одна проблема заключается в том, что класс View не имеет метода setWeight () (который требуется ObjectAnimator). Чтобы обратиться к этому, я написал простую оболочку, которая помогает архивировать анимацию веса.

 public class ViewWeightAnimationWrapper { private View view; public ViewWeightAnimationWrapper(View view) { if (view.getLayoutParams() instanceof LinearLayout.LayoutParams) { this.view = view; } else { throw new IllegalArgumentException("The view should have LinearLayout as parent"); } } public void setWeight(float weight) { LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) view.getLayoutParams(); params.weight = weight; view.getParent().requestLayout(); } public float getWeight() { return ((LinearLayout.LayoutParams) view.getLayoutParams()).weight; } } 

Используйте его таким образом:

  ViewWeightAnimationWrapper animationWrapper = new ViewWeightAnimationWrapper(view); ObjectAnimator anim = ObjectAnimator.ofFloat(animationWrapper, "weight", animationWrapper.getWeight(), weight); anim.setDuration(2500); anim.start(); 

Я тоже смотрел на это. В конце концов я решил это, оживив свойство weightsum родителя, которое работает очень хорошо, если у вас есть два представления в LinearLayout.

См. Анимация свойства weightSum с помощью ObjectAnimator

В приведенном ниже примере, если вы анимируете weightSum от 1.0 до 2.0, экран 2 будет хорошо анимировать.

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/dual_pane" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal" android:weightSum="1.0"> <!-- Screen 1 --> <LinearLayout android:layout_width="0dp" android:layout_height="match_parent" android:background="#ff0000" android:layout_weight="1"> </LinearLayout> <!-- Screen 2 --> <LinearLayout android:layout_width="0dp" android:layout_height="match_parent" android:background="#ff6600" android:layout_weight="1"> </LinearLayout> </LinearLayout> ? <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/dual_pane" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal" android:weightSum="1.0"> <!-- Screen 1 --> <LinearLayout android:layout_width="0dp" android:layout_height="match_parent" android:background="#ff0000" android:layout_weight="1"> </LinearLayout> <!-- Screen 2 --> <LinearLayout android:layout_width="0dp" android:layout_height="match_parent" android:background="#ff6600" android:layout_weight="1"> </LinearLayout> </LinearLayout>