사용자 정의 대화 상자 애니메이션


97

텍스트보기에서 아래로 슬라이딩하는 것처럼 사용자 지정 대화 상자를 표시하려고합니다. 이게 가능해? 대화 클래스에 애니메이션을 적용 할 수없는 것 같습니다. 생성자에서이 줄을 시도했지만 효과가 없습니다.

this.getWindow (). setWindowAnimations (R.anim.paranimation);

애니메이션이 옳은지는 확실하지 않지만, 뭘하는지 확인하면 조정할 수 있습니다. 완전성을 위해 아래에 나열하겠습니다. 실제 애니메이션에 대한 도움말이 아니라 대화 상자에 대한 응용 프로그램 만 있습니다.

paranimation.xml :

<?xml version="1.0" encoding="utf-8"?>
<translate
xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="-200%"
    android:toXDelta="0%"
    android:fromYDelta="200%"
    android:toYDelta="0%"
    android:duration="3000"
    android:zAdjustment="top">
</translate>

4
이것도 알아야합니다. 이것 외에는 거의 모든 것에 애니메이션을 적용하는 것이 가능해 보입니다. 아니면 내가 틀렸어?!
andy_spoo

답변:


215

저는 오늘 Dialog 애니메이션으로 어려움을 겪었고 마침내 스타일을 사용하여 작동하게되었으므로 여기에 예가 있습니다.

우선, 가장 중요한 것은 아마도 오늘 5 가지 방식으로 작동했지만 알 수 없었습니다. 장치 애니메이션 설정이 "애니메이션 없음"(설정 → 디스플레이 → 애니메이션)으로 설정되어 있으면 대화 상자가 이겼습니다. 당신이 무엇을하든 애니메이션되지 마십시오!

다음은 내 styles.xml의 제거 된 버전입니다. 자명하기를 바랍니다. 이 위치는 res/values.

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="PauseDialog" parent="@android:style/Theme.Dialog">
        <item name="android:windowAnimationStyle">@style/PauseDialogAnimation</item>
    </style>

    <style name="PauseDialogAnimation">
        <item name="android:windowEnterAnimation">@anim/spin_in</item>
        <item name="android:windowExitAnimation">@android:anim/slide_out_right</item>
    </style>
</resources>

windowEnterAnimation내 애니메이션 중 하나입니다에 위치하고 있습니다 res\anim. 는 windowExitAnimation안드로이드 SDK의 일부인 애니메이션 중 하나입니다.

그런 다음 내 활동 onCreateDialog(int id)방법 에서 대화 상자를 만들 때 다음을 수행합니다.

Dialog dialog = new Dialog(this, R.style.PauseDialog);

// Setting the title and layout for the dialog
dialog.setTitle(R.string.pause_menu_label);
dialog.setContentView(R.layout.pause_menu);

또는 테마를 사용하는 Dialog 생성자를 사용하는 대신 다음과 같은 방법으로 애니메이션을 설정할 수 있습니다.

Dialog dialog = new Dialog(this);
dialog.getWindow().getAttributes().windowAnimations = R.style.PauseDialogAnimation;

2
이 예제를 위해 만든 이름 일뿐입니다. 실제로 애니메이션을 만든 적이 없습니다.
ChrisJD 2011 년

2
이 답변에 감사드립니다 . Android 개발자 그룹 의 단서를 통해이 게시물을 찾았지만 문서화가 제대로되지 않았습니다 .
David Snabel-Caunt 2011

3
+1 "장치 애니메이션 설정이"애니메이션 없음 "(설정 → 표시 → 애니메이션)으로 설정되어 있으면 어떤 작업을해도 대화 상자가 애니메이션으로 표시되지 않습니다!"의 경우. 나는 그것을 확인하는 것을 잊었다.
Vincent Mimoun-Prat

Dialog dialog = new Dialog(this, R.style.PauseDialog);API 11 용이지만 일반적입니다Dialog dialog = new Dialog(Context context);
mehmet

2
내가 직면 한 문제는 대화 상자가 표시 될 때 응용 프로그램을 최소화하고 다시 응용 프로그램을 복원하면 대화 상자가 다시 애니메이션되고 그것을 피하는 방법은 완벽하다는 것입니다. +1
Parth Anjaria

56

ChrisJD 코드를 사용하여 Dialogbox 용 Fade in 및 Fade Out 애니메이션을 만들었습니다.

  1. res / style.xml 내부

    <style name="AppTheme" parent="android:Theme.Light" />
    <style name="PauseDialog" parent="@android:style/Theme.Dialog">
        <item name="android:windowAnimationStyle">@style/PauseDialogAnimation</item>
    </style>
    
    <style name="PauseDialogAnimation">
        <item name="android:windowEnterAnimation">@anim/fadein</item>
        <item name="android:windowExitAnimation">@anim/fadeout</item>
    </style>
    

  2. anim / fadein.xml 내부

    <alpha xmlns:android="http://schemas.android.com/apk/res/android"
        android:interpolator="@android:anim/accelerate_interpolator"
        android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="500" />
    
  3. anim / fadeout.xml 내부

    <alpha xmlns:android="http://schemas.android.com/apk/res/android"
        android:interpolator="@android:anim/anticipate_interpolator"
        android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="500" />
    
  4. 주요 활동

    Dialog imageDiaglog= new Dialog(MainActivity.this,R.style.PauseDialog);

11
당신은 기본을 사용할 수 있습니다 안드로이드 페이드 애니메이션 '@android : ANIM / fade_in' '@android : ANIM / fade_out'
마렉

19

오른쪽에서 왼쪽 (애니메이션 시작) 및 왼쪽에서 오른쪽 (애니메이션 종료) :

styles.xml :

<style name="CustomDialog" parent="@android:style/Theme.Dialog">
    <item name="android:windowAnimationStyle">@style/CustomDialogAnimation</item>
</style>

<style name="CustomDialogAnimation">
    <item name="android:windowEnterAnimation">@anim/translate_left_side</item>
    <item name="android:windowExitAnimation">@anim/translate_right_side</item>
</style>

res / anim /에 두 개의 파일을 만듭니다.

translate_right_side.xml :

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromXDelta="0%" android:toXDelta="100%"
    android:fromYDelta="0%" android:toYDelta="0%"
    android:duration="600"/>

translate_left_side.xml :

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="600"
    android:fromXDelta="100%"
    android:toXDelta="0%"/>

조각 / 활동에서 :

Dialog dialog = new Dialog(getActivity(), R.style.CustomDialog);

13

나는 같은 문제를 만났지만, 마침내 나는 문제를 따라 갔다.

((ViewGroup)dialog.getWindow().getDecorView())
.getChildAt(0).startAnimation(AnimationUtils.loadAnimation(
context,android.R.anim.slide_in_left));

4
현명한 대답이 아닙니다. 대화 상자 내부의 전망은 애니메이션됩니다
DJphy

12

먼저 res / anim dir에 두 개의 애니메이션 리소스를 만들어야합니다.

slide_up.xml

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

slide_bottom.xml

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

그런 다음 스타일을 만들어야합니다.

<style name="DialogAnimation">
    <item name="android:windowEnterAnimation">@anim/slide_up</item>
    <item name="android:windowExitAnimation">@anim/slide_bottom</item>
</style>

이 줄을 수업에 추가하십시오.

dialog.getWindow().getAttributes().windowAnimations = R.style.DialogAnimation; //style id

http://www.devexchanges.info/2015/10/showing-dialog-with-animation-in-android.html 기반


참조 URL이 유용합니다!
ahmednabil88

2

아래 코드를 시도하십시오.

public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));// set transparent in window background

        View _v = inflater.inflate(R.layout.some_you_layout, container, false);

        //load animation
        //Animation transition_in_view = AnimationUtils.loadAnimation(getContext(), android.R.anim.fade_in);// system animation appearance
        Animation transition_in_view = AnimationUtils.loadAnimation(getContext(), R.anim.customer_anim);//customer animation appearance

        _v.setAnimation( transition_in_view );
        _v.startAnimation( transition_in_view );
        //really beautiful
        return _v;

    }

사용자 지정 Anim을 만듭니다. res / anim / customer_anim.xml :

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

    <translate
        android:duration="500"
        android:fromYDelta="100%"
        android:toYDelta="-7%"/>
    <translate
        android:duration="300"
        android:startOffset="500"
        android:toYDelta="7%" />
    <translate
        android:duration="200"
        android:startOffset="800"
        android:toYDelta="0%" />

</set>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.