ทำให้กล่องโต้ตอบที่กำหนดเองเคลื่อนไหว


98

ฉันกำลังพยายามให้กล่องโต้ตอบที่กำหนดเองปรากฏขึ้นราวกับว่ามันเลื่อนลงมาจากมุมมองข้อความ เป็นไปได้หรือไม่ ฉันไม่สามารถใช้แอนิเมชั่นกับคลาสไดอะล็อกได้ ฉันได้ลองใช้บรรทัดนี้ในตัวสร้าง แต่ไม่มีผล:

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

คำตอบ:


218

วันนี้ฉันกำลังดิ้นรนกับแอนิเมชั่น 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 เป็นหนึ่งในภาพเคลื่อนไหวที่เป็นส่วนหนึ่งของ Android SDKres\animwindowExitAnimation

จากนั้นเมื่อฉันสร้าง Dialog ใน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 = new Dialog(this);
dialog.getWindow().getAttributes().windowAnimations = R.style.PauseDialogAnimation;

2
นั่นเป็นเพียงชื่อที่ฉันสร้างขึ้นสำหรับตัวอย่างนี้ฉันไม่เคยสร้างแอนิเมชั่นนั้นจริงๆ
ChrisJD

2
ขอบคุณมากสำหรับคำตอบนี้มันมีเอกสารไม่ดีจริงๆแม้ว่าฉันจะพบโพสต์นี้ผ่านเบาะแสจากกลุ่มนักพัฒนา Android
David Snabel-Caunt

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

57

ฉันได้สร้างแอนิเมชั่น Fade in และ Fade Out สำหรับ Dialogbox โดยใช้รหัส ChrisJD

  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);
    

12
คุณสามารถใช้แอนิเมชั่นเฟดเริ่มต้นของ Android '@android: anim / fade_in' '@android: anim / fade_out'
Marek

ขอบคุณก่อนหน้านี้ไม่มีตอนที่ฉันโพสต์คำตอบนี้ :)
Akshay Taru

20

สำหรับขวาไปซ้าย (ภาพเคลื่อนไหว) และจากซ้ายไปขวา (ออกจากภาพเคลื่อนไหว):

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

13

ขั้นแรกคุณต้องสร้างทรัพยากรแอนิเมชั่นสองแหล่งใน 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.