Intereting Posts
Как дождаться завершения всех задач в ThreadPoolExecutor, не закрывая Executor? Как экспортировать данные облака точек (Project Tango)? Android: программно изменить все направления размещения приложений Меню Android ActionBar с вертикальными (повернутыми) текстовыми элементами на основе поставщика пользовательских действий Определение четных / нечетных чисел (целых чисел)? Почему этот простой сервис не запускается? Заставить HttpURLConnection использовать мобильную сеть и вернуть ее в WiFi Integer.parseInt и NumberFormatException на Android Динамически добавлять изображения в виджет галереи Ошибка синхронизации синдрома студии Android Получить содержание uri из пути к файлу в android Активность по умолчанию не найдена в Android Studio Показать настройки под аккаунтами и меню синхронизации для приложения для Android GetSupportFragmentManager () не определен Android SQLite: попытка повторного открытия уже закрытого объекта

Перевести вид с одного макета на другой с переводом анимации

Я новичок в анимации Android, и мое требование – перевести представление из одного макета в макет в одном XML-файле при щелчке этого представления.

Сценарий: предположим, что я нажимаю кнопку, находящуюся в верхней части заголовка в XML-файле, и она должна перемещаться / переводить вниз (она должна оказывать влияние на то, что она лежит на другом макете вниз до заголовка), а также я хочу, чтобы Когда пользователь снова нажмет на него, он теперь должен перейти в исходное положение.

Здесь я объясняю свой файл xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/app_bg" android:orientation="vertical" > <RelativeLayout android:id="@+id/top" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@drawable/header" android:paddingLeft="10dp" android:paddingRight="10dp" > <Button android:id="@+id/btnSearchHeader" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_centerInParent="true" android:background="@drawable/search_icon" /> </RelativeLayout> <RelativeLayout android:id="@+id/bottom" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@color/app_transparent" android:paddingLeft="10dp" android:paddingRight="10dp" android:layout_marginTop="10dp" android:visibility="visible" > <Button android:id="@+id/btnMenu" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_centerVertical="true" android:layout_marginRight="5dp" android:text="ABC" /> <Button android:id="@+id/btnSearchSelected" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_toRightOf="@+id/btnMenu" android:text="CDE" /> </RelativeLayout> </LinearLayout> 

БОЛЬШЕ ТОЧНОСТИ ТРЕБОВАНИЯ (Пожалуйста, внимательно прочитайте 🙂

Здесь у меня есть два внутренних внутренних макета:

Верхний макет – id-> top Нижний макет – id -> нижний

Теперь представление (Button -> btnSearchHeader) лежит в моем верхнем макете, и я хочу анимировать его до нижнего макета (он должен оказывать влияние на то, что он переводится с помощью трансляционной анимации в нижний макет) при нажатии этой кнопки И когда пользователь нажимает на эту кнопку, он должен снова перевести обратно в исходное положение с помощью трансляционной анимации .. то есть он должен отображаться в верхней макете

Я понятия не имею, как дать эти воздействия, используя трансляцию анимации, однако у меня есть только базовое знание трансляции, которое недостаточно для меня, чтобы я работал над своим требованием.

Любая соответствующая помощь заметна.

благодаря

Solutions Collecting From Web of "Перевести вид с одного макета на другой с переводом анимации"

Вы пробовали что-то вроде следующего?

  final int topHeight = findViewById(R.id.top).getHeight(); final int bottomHeight = findViewById(R.id.bottom).getHeight(); final View button = findViewById(R.id.btnSearchHeader); final ObjectAnimator moveDownAnim = ObjectAnimator.ofFloat(button, "translationY", 0.F, topHeight + bottomHeight / 2 - button.getHeight() / 2); final ObjectAnimator moveUpAnim = ObjectAnimator.ofFloat(button, "translationY", topHeight + bottomHeight / 2 - button.getHeight() / 2, 0.F); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (0.F == v.getTranslationY()) moveDownAnim.start(); else moveUpAnim.start(); } }); 

Если вам действительно нужно представление кнопки для изменения родителей, вы можете использовать AnimatorListener для достижения этого в конце каждой анимации. Что-то вроде:

 moveDownAnim.addListener(new Animator.AnimatorListener() { @Override public void onAnimationEnd(Animator animation) { ((ViewGroup)findViewById(R.id.top)).removeView(button); ((ViewGroup)findViewById(R.id.bottom)).addView(button); ((RelativeLayout)button.getLayoutParams()).addRule(RelativeLayout.CENTER_IN_PARENT); button.setTranslationY(0.F); // Since it is now positioned in the new layout, no need for translation. } @Override public void onAnimationCancel(Animator animation) { /* NOP */ } @Override public void onAnimationRepeat(Animator animation) { /* NOP */ } @Override public void onAnimationStart(Animator animation) { /* NOP */ } }); 

(И аналогичный слушатель для moveUpAnim .)

Тем не менее, я сомневаюсь, что вам нужно сделать это для достижения желаемого визуального эффекта. Но если вы сделаете эту часть, вам, вероятно, также потребуется установить фиксированную высоту для вашего top вида, а не для wrap_content . (В противном случае, если переход макета происходит, когда кнопка перемещена в нижний вид, высота верхнего макета может перейти в 0, если в нем нет ничего.) Проще всего просто сделать это непосредственно в файле макета xml. Однако, если вы хотите «сделать это на лету», вы можете изменить высоту макета в onAnimationEnd() используя что-то вроде:

 @Override public void onAnimationEnd(Animator animation) { final ViewGroup topLayout = findViewById(R.id.top); topLayout.getLayoutParams().height = topLayout.getHeight(); // Keep it the same height... topLayout.removeView(button); ((ViewGroup)findViewById(R.id.bottom)).addView(button); ((RelativeLayout)button.getLayoutParams()).addRule(RelativeLayout.CENTER_IN_PARENT); button.setTranslationY(0.F); // Since it is now positioned in the new layout, no need for translation. }