source

Android 단편 및 애니메이션

factcode 2023. 8. 17. 21:55
반응형

Android 단편 및 애니메이션

예를 들어 허니콤 지메일 클라이언트가 사용하는 슬라이딩을 어떻게 구현해야 합니까?

할 수 있다TransactionManager프래그먼트를 추가하고 제거하여 자동으로 처리합니다. 에뮬레이터가 슬라이드 쇼이기 때문에 테스트하기가 어렵습니다. :)

fragment 간의 전환을 애니메이션화하거나 fragment를 표시하거나 숨기는 프로세스를 애니메이션화하기 위해 사용합니다.Fragment Manager를 생성하기 위해Fragment Transaction.

각 조각 트랜잭션 내에서 각각 표시 및 숨기기(또는 바꾸기를 사용할 때 둘 다)에 사용할 내부 및 외부 애니메이션을 지정할 수 있습니다.

다음 코드는 조각 하나를 밀어내고 다른 조각을 밀어넣어 조각을 대신하는 방법을 보여줍니다.

FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);

DetailsFragment newFragment = DetailsFragment.newInstance();

ft.replace(R.id.details_fragment_container, newFragment, "detailFragment");

// Start the animated transition.
ft.commit();

단순히 호출하는 조각을 숨기거나 표시하는 것과 동일한 작업을 수행하는 것입니다.ft.show또는ft.hide각각 표시하거나 숨기려는 조각을 전달합니다.

참고로, XML 애니메이션 정의는 다음을 사용합니다.objectAnimatortag. slide_in_left의 예는 다음과 같습니다.

<?xml version="1.0" encoding="utf-8"?>
<set>
  <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:propertyName="x" 
    android:valueType="floatType"
    android:valueFrom="-1280"
    android:valueTo="0" 
    android:duration="500"/>
</set>

지원 라이브러리를 사용할 필요가 없다면 Roman의 답변을 확인하십시오.

그러나 지원 라이브러리를 사용하려면 아래 설명된 대로 기존 애니메이션 프레임워크를 사용해야 합니다.

레토와 블라인드스터프의 답변을 참고한 결과 다음과 같은 코드가 작동합니다.

조각들은 오른쪽에서 미끄러져 들어가고 뒤로 누르면 왼쪽으로 미끄러지는 것처럼 보입니다.

FragmentManager fragmentManager = getSupportFragmentManager();

FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.setCustomAnimations(R.anim.enter, R.anim.exit, R.anim.pop_enter, R.anim.pop_exit);

CustomFragment newCustomFragment = CustomFragment.newInstance();
transaction.replace(R.id.fragment_container, newCustomFragment );
transaction.addToBackStack(null);
transaction.commit();

순서가 중요합니다.이는 전화를 하기 전에 해야 한다는 것을 의미합니다. 그렇지 않으면 애니메이션이 적용되지 않습니다!

다음으로 이러한 파일은 res/anim 폴더 안에 배치해야 합니다.

.xml 입력:

<?xml version="1.0" encoding="utf-8"?>
<set>
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
               android:fromXDelta="100%"
               android:toXDelta="0"
               android:interpolator="@android:anim/decelerate_interpolator"
               android:duration="@android:integer/config_mediumAnimTime"/>
</set>

exit.xml:

<set>
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
               android:fromXDelta="0"
               android:toXDelta="-100%"
               android:interpolator="@android:anim/accelerate_interpolator"
               android:duration="@android:integer/config_mediumAnimTime"/>
</set>

pop_enter.xml:

<set>
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
               android:fromXDelta="-100%"
               android:toXDelta="0"
               android:interpolator="@android:anim/decelerate_interpolator"
               android:duration="@android:integer/config_mediumAnimTime"/>
</set>

pop_module.xml:

<?xml version="1.0" encoding="utf-8"?>
<set>
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
               android:fromXDelta="0"
               android:toXDelta="100%"
               android:interpolator="@android:anim/accelerate_interpolator"
               android:duration="@android:integer/config_mediumAnimTime"/>
</set>

애니메이션 기간은 다음과 같은 기본값으로 변경할 수 있습니다.@android:integer/config_shortAnimTime또는 다른 번호.

fragment 교체 사이에 구성 변경(예: 회전)이 발생하면 백 액션이 애니메이션으로 표시되지 않습니다.이것은 지원 라이브러리의 rev 20에 여전히 존재하는 문서화된 버그입니다.

애니메이션 파일을 만드는 대신 이 기능을 사용하는 것이 훨씬 더 나은 솔루션이기 때문에 적극 추천합니다.Android Studio는 이미 기본값을 제공합니다. animation새 XML 파일을 만들지 않고 사용할 수 있습니다.이 애니메이션의 이름은 안드로이드입니다.R.anim.slide_in_leftAndroid.R.anim.slide_out_right는 다음과 같이 사용할 수 있습니다.

fragmentTransaction.사용자 지정 애니메이션(안드로이드)을 설정합니다.R.anim.slide_in_left, 안드로이드.R.anim.slide_out_right);

FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();              
fragmentTransaction.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right);
fragmentManager.addOnBackStackChangedListener(this);
fragmentTransaction.replace(R.id.frame, firstFragment, "h");
fragmentTransaction.addToBackStack("h");
fragmentTransaction.commit();

출력:

enter image description here

수정된 지원 라이브러리는 View 애니메이션 사용을 모두 지원합니다(예:<translate>, <rotate>) 및 개체 애니메이터(즉, 개체 애니메이터).<objectAnimator>)(Fragment Transitions의 경우).나인올드안드로이드로 구현됩니다.자세한 내용은 github에 있는 내 문서를 참조하십시오.

저는 뷰 디렉션이 필요합니다.

in -> 오른쪽에서 스와이프합니다.

out -> 왼쪽으로 스와이프합니다.

다음 코드를 사용할 수:

slide_in_right.xml

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="50%p" android:toXDelta="0"
            android:duration="@android:integer/config_mediumAnimTime"/>
    <alpha android:fromAlpha="0.0" android:toAlpha="1.0"
            android:duration="@android:integer/config_mediumAnimTime" />
</set>

slide_out_left.xml

 <set xmlns:android="http://schemas.android.com/apk/res/android">
        <translate android:fromXDelta="0" android:toXDelta="-50%p"
                android:duration="@android:integer/config_mediumAnimTime"/>
        <alpha android:fromAlpha="1.0" android:toAlpha="0.0"
                android:duration="@android:integer/config_mediumAnimTime" />
    </set>

트랜잭션 코드:

inline fun FragmentActivity.setContentFragment(
        containerViewId: Int,
        backStack: Boolean = false,
        isAnimate: Boolean = false,
        f: () -> Fragment

): Fragment? {
    val manager = supportFragmentManager
    return f().apply {
        manager.beginTransaction().let {
            if (isAnimate)
                it.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left)

            if (backStack) {
                it.replace(containerViewId, this, "Fr").addToBackStack("Fr").commit()
            } else {
                it.replace(containerViewId, this, "Fr").commit()
            }
        }
    }
}

아래와 같은 방법으로 해결합니다.

Animation anim = AnimationUtils.loadAnimation(this, R.anim.slide);
fg.startAnimation(anim);
this.fg.setVisibility(View.VISIBLE); //fg is a View object indicate fragment

언급URL : https://stackoverflow.com/questions/4817900/android-fragments-and-animation

반응형