Анимация перехода между фрагментом - PullRequest
0 голосов
/ 18 мая 2018

У меня есть два фрагмента (A, B), среди которых я могу поменяться;то, чего я хотел добиться, - это анимацию скольжения вверх / вниз между ними каждый раз, когда я обменивал их.

Я пытался использовать два объекта-аниматора, например:

//slide up
<objectAnimator
    android:interpolator="@android:interpolator/linear"
    android:propertyName="translationY"
    android:valueType="intType"
    android:valueFrom="1920"
    android:valueTo="0"
    android:duration="1000" />

//Slide down  
<objectAnimator
    android:interpolator="@android:interpolator/linear"
    android:propertyName="translationY"
    android:valueType="intType"
    android:valueFrom="0"
    android:valueTo="1920"
    android:duration="1000" />

, но он не работалпотому что два фрагмента перекрывались.Так как я могу сделать эту анимацию?

Фрагмент A:

class FragmentA : Fragment(){

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    buttonA.setOnClickListener {
        activity.supportFragmentManager.beginTransaction()
                .setCustomAnimations(R.animator.slide_dowm, R.animator.slide_up)
                .replace(R.id.container, FragmentB()).commit()
    }
}
}

Фрагмент B:

class FragmentB : Fragment(){

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    buttonB.setOnClickListener {
        activity.supportFragmentManager.beginTransaction()
                .setCustomAnimations(R.animator.slide_up, R.animator.slide_down)
                .replace(R.id.container, FragmentB()).commit()
    }
}
}

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Google выпустил новый Навигационный интерфейс библиотека

Итак, теперь мы можем делать те же переходы фрагмента из ресурса your_named_navigation.xml (main> res> navigation> your_named_navigation.xml),

это фрагмент кода моей реализации:

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    app:startDestination="@+id/first_fragment">

    <fragment
        android:id="@+id/first_fragment"
        android:name="com.yourpackage.FirstFragment"
        android:label="@string/title_first"
        tools:layout="@layout/fragment_first">

        <action
            android:id="@+id/second_fragment_action"
            app:destination="@id/second_fragment"
            app:enterAnim="@anim/slide_in_right"
            app:exitAnim="@anim/slide_out_left"
            app:popEnterAnim="@anim/slide_in_left"
            app:popExitAnim="@anim/slide_out_right" />

    </fragment>

    <fragment
        android:id="@+id/second_fragment"
        android:name="com.yourpackage.SecondFragment"
        android:label="@string/title_second"
        tools:layout="@layout/fragment_second">

        <action ...next fragment/>

    </fragment>

</navigation>

он также помогает обрабатывать нажатия на кнопки «назад» и «вверх»,

, так что после реализации NavigationUi в нашемПроект, мы можем вызвать из нашего экземпляра firstFragment метод Navigation.findNavController

myButton.setOnClickListener(View.OnClickListener {
    //This opens our second fragment creating a stack of fragments
    Navigation.findNavController(it).navigate(R.id.second_fragment_action)
})

Следующий Codelab от Google помог мне, может быть, может помочь вам, привет

0 голосов
/ 18 мая 2018

animator / slide_in_left.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <objectAnimator
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="500"
        android:propertyName="x"
        android:valueFrom="1000"
        android:valueTo="0"
        android:valueType="floatType" />

</set>

animator / slide_out_right.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <objectAnimator
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="500"
        android:propertyName="x"
        android:valueFrom="0"
        android:valueTo="-1000"
        android:valueType="floatType" />

</set>

Подкатегория классов

 public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            // return super.onCreateView(inflater, container, savedInstanceState);

            View view = (ViewGroup) inflater.inflate(R.layout.product_frame, null);
            getFragmentManager().beginTransaction()
                    .replace(R.id.sub_header, new Sub_Header()).commit();
            getFragmentManager()
                    .beginTransaction()
                    .setCustomAnimations(R.animator.slide_in_left,
                            R.animator.slide_out_right, 0, 0)
                    .replace(R.id.product_frame, new Sub_Catagory_Grid()).commit();

            view.getWidth();
            return view;

        }

Некоторые ссылки

Анимация транзакции фрагмента: вставлять и выдвигать

Как применять анимацию постепенного исчезновения / затухания при замене фрагмента

...