Intereting Posts
Объедините покрытие jacoco от androidTest и теста Не удается увидеть окончательное содержимое переменной внутри анонимного класса при отладке приложения Eclipse для Android Проблемы при масштабировании изображения YUV с использованием библиотеки libyuv Измерение производительности с помощью инструментария Android Ошибка сборки Gradle после обновления Android Studio до версии 2.2 Preview 3 Пользовательская форма Linearlayout с изогнутой стороной в android Настройка размера ImageButton на Android Получение атрибута «android: icon»: атрибут не является строковым значением »при загрузке APK в хранилище воспроизведения Java.lang.InstantiationException: класс не имеет конструктора нулевых аргументов Как я могу преобразовать ByteArrayInputStream в jpeg и отображать на мобильном устройстве Android? Как правильно удалить фрагмент оставшегося экземпляра Как правильно определить зависимость v7 appcompat? Robolectric раздувает пользовательские представления для тестов Как сделать TimePicker меньше Как изменить размер текста заголовка в панели действий?

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

Я новичок в анимации 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. }