Tạo hoạt ảnh cho Hộp thoại tùy chỉnh


97

Tôi đang cố gắng để một hộp thoại tùy chỉnh xuất hiện như thể nó đang trượt xuống từ chế độ xem văn bản. Điều này có khả thi không? Tôi dường như không thể áp dụng bất kỳ hoạt ảnh nào cho lớp hộp thoại. Tôi đã thử dòng này trong hàm tạo, nhưng nó không có tác dụng:

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

Tôi thậm chí không chắc liệu hoạt ảnh có chính xác hay không, nhưng tôi sẽ có thể điều chỉnh nó khi tôi thấy nó đang hoạt động. Tôi sẽ liệt kê nó dưới đây cho đầy đủ. Tôi không tìm kiếm trợ giúp về hoạt ảnh thực tế, chỉ là ứng dụng vào hộp thoại.

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
Tôi cũng cần biết điều này. Dường như có thể tạo hoạt ảnh cho bất cứ thứ gì, ngoại trừ điều này. Hoặc là tôi sai?!
andy_spoo

Câu trả lời:


214

Hôm nay tôi đang vật lộn với hoạt ảnh Dialog, cuối cùng thì nó cũng hoạt động bằng cách sử dụng các kiểu, vì vậy đây là một ví dụ.

Để bắt đầu, điều quan trọng nhất - tôi có thể đã làm cho nó hoạt động theo 5 cách khác nhau ngày hôm nay nhưng không thể nói vì ... Nếu cài đặt hoạt ảnh thiết bị của bạn được đặt thành "Không có hoạt ảnh" (Cài đặt → Hiển thị → Hoạt ảnh) thì hộp thoại sẽ thắng không được hoạt hình cho dù bạn làm gì!

Sau đây là phiên bản rút gọn của styles.xml của tôi. Hy vọng rằng nó là tự giải thích. Điều này nên được đặt tại 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>

Đây windowEnterAnimationlà một trong những hình ảnh động của tôi và được đặt tại res\anim. Đây windowExitAnimationlà một trong những hoạt ảnh là một phần của Android SDK.

Sau đó, khi tôi tạo Hộp thoại trong onCreateDialog(int id)phương thức hoạt động của mình, tôi thực hiện như sau.

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

Ngoài ra, bạn có thể đặt các hoạt ảnh theo cách sau thay vì sử dụng hàm tạo Hộp thoại có chủ đề.

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

2
Đó chỉ là một cái tên mà tôi đặt ra cho ví dụ này, tôi chưa bao giờ thực sự tạo ra hoạt ảnh đó.
ChrisJD

2
Cảm ơn rất nhiều về câu trả lời này, nó thực sự kém tài liệu, mặc dù tôi đã tìm thấy bài đăng này qua manh mối từ nhóm Nhà phát triển Android .
David Snabel-Caunt

3
+1 Đối với thông báo "Nếu cài đặt hoạt ảnh trên thiết bị của bạn được đặt thành" Không có hoạt ảnh "(Cài đặt → Hiển thị → Hoạt ảnh) thì các hộp thoại sẽ không hoạt ảnh cho dù bạn làm gì!". Tôi đã quên kiểm tra điều đó.
Vincent Mimoun-Prat

Dialog dialog = new Dialog(this, R.style.PauseDialog);nó dành cho API 11 nhưng điều này là chungDialog dialog = new Dialog(Context context);
mehmet

2
vấn đề mà tôi đang gặp phải là khi tôi thu nhỏ ứng dụng khi hộp thoại đang hiển thị và khôi phục lại ứng dụng, hộp thoại sẽ hoạt động trở lại, làm thế nào để tránh điều đó, hãy nghỉ ngơi hoàn hảo. +1
Parth Anjaria

56

Tôi đã tạo hoạt ảnh Fade in and Fade Out cho Hộp thoại bằng mã ChrisJD.

  1. Bên trong 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. Bên trong 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. Bên trong 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. Hoạt động chủ yêu

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

11
Bạn có thể sử dụng mặc định android phai hình ảnh động '@android: anim / fade_in' '@android: anim / fade_out'
Marek

19

Đối với từ phải sang trái (hoạt ảnh nhập) và từ trái sang phải (hoạt ảnh thoát):

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>

Tạo hai tệp trong 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%"/>

Trong bạn Fragment / Activity:

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

13

Tôi gặp vấn đề tương tự, nhưng cuối cùng tôi giải quyết vấn đề theo cách sau

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

4
Không phải là một câu trả lời hợp lý. Các chế độ xem bên trong hộp thoại được làm động
DJphy

12

Đầu tiên, bạn phải tạo hai tài nguyên hoạt ảnh trong 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>

sau đó bạn phải tạo ra một phong cách

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

và thêm dòng này vào lớp của bạn

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

Có trụ sở tại http://www.devexchanges.info/2015/10/showing-dialog-with-animation-in-android.html


URL tham chiếu rất hữu ích!
ahmednabil88

2

Hãy thử mã dưới đây:

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;

    }

Tạo Hoạt ảnh tùy chỉnh.: 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>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.