Chuyển đổi hoạt động trong Android


188

Làm cách nào tôi có thể xác định chuyển đổi giữa hai hoạt động cho Android 1.5 trở lên? Tôi muốn một hoạt động mờ dần trong.


7
Áp dụng cho tất cả overridePendingTransitioncác câu trả lời liên quan dưới đây: Bạn có thể vượt qua (0, 0)nếu bạn không muốn có hoạt hình nào cả.
dokkaebi

Câu trả lời:


164

Bạn có thể làm điều này với Activity.overridePendingTransition(). Bạn có thể định nghĩa các hình ảnh động chuyển tiếp đơn giản trong tệp tài nguyên XML.


Cảm ơn iandisme. overridePengingTransition là API cấp 5. Có thể thực hiện việc này cho cấp 3 (Android 1.5) không?
hpique

À, bạn nói đúng. Câu trả lời của CaseyB có lẽ phù hợp hơn với những gì bạn đang tìm kiếm.
iandisme

Vẫn chưa tìm ra cách làm mờ dần với câu trả lời của CaseyB.
hpique

1
Bạn có thể làm điều này trong onCreatechức năng Hoạt động của bạn .
mxcl

1
Trên HTC, bạn phải thay đổi cài đặt> hiển thị> hoạt hình thành tất cả để nó hoạt động (hoặc ít nhất là trên HTC Desire HD).
Urboss

191

Đây là mã để làm mờ dần đẹp giữa hai Hoạt động ..

Tạo một tệp gọi là fadein.xmltrongres/anim

<?xml version="1.0" encoding="utf-8"?>
<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="2000" />

Tạo một tệp gọi là fadeout.xmltrongres/anim

<?xml version="1.0" encoding="utf-8"?>

<alpha xmlns:android="http://schemas.android.com/apk/res/android"
   android:interpolator="@android:anim/accelerate_interpolator"
   android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="2000" />

Nếu bạn muốn phai từ Hoạt động Một đến Hoạt động B , đặt sau đây trong các onCreate()phương pháp Hoạt động B . Trước khi setContentView()làm việc cho tôi.

overridePendingTransition(R.anim.fadein, R.anim.fadeout);

Nếu độ mờ quá chậm đối với bạn, hãy thay đổi android:durationcác tệp xml ở trên thành một cái gì đó nhỏ hơn.


53
Chỉ để thêm vào này. overridePendingTransition () sẽ cần được gọi lại, ngay sau khi HĐH quyết định đóng Activity của bạn. Tôi chỉ thực hiện một cuộc gọi giống hệt khác để ghi đèPendingTransition (fadein, fadeout) trong phương thức onPause () của Activity. Nếu không, bạn sẽ thấy Hoạt động mờ dần, nhưng không mờ dần khi đóng.
Nate

2
Không có câu trả lời trên chủ đề khác. Tôi đang xóa nó. Những gì tôi trải nghiệm là những gì xảy ra là quá trình chuyển đổi xảy ra ngay lập tức và sau đó nó tối dần và mờ dần. Vì vậy, tôi đang ở Hoạt động A và Hoạt động B được hiển thị sau đó mờ đi và mờ dần. Sau đó, tôi đã sửa đổi nó để làm theo hướng dẫn với thêm mã vào onPause () của Hoạt động A và nhận hành vi tương tự.
Geek On Hugs

12
Sử dụng các hình động được tích hợp trong Android dường như giúp chuyển tiếp mượt mà hơn: overridePendingTransition(android.R.anim.fadein, android.R.anim.fadeout); Xem các tệp đó cũng có thể cho bạn gợi ý về cách cải thiện hoạt ảnh tùy chỉnh của bạn (ví dụ: bằng cách làm mờ dần trong thời gian dài hơn mờ dần).
Dan J

3
Chỉ cần đừng quên thay đổi fadeinfadeoutđể fade_infade_out. Từ bài của Dan J
Farid

1
Theo các tài liệu, bạn nên gọi overridePendingTransition()ngay sau khi gọi finish()và / hoặc startActivity(). Tôi đã có thể có được một sự mờ dần tốt đẹp theo cách này bằng cách gọi nó ngay sau khi khởi chạy Activity mới.
Ionoclast Brigham

50

Một cách thậm chí dễ dàng để làm điều đó là:

  1. Tạo một kiểu hoạt hình vào tệp kiểu tệp của bạn
<style name="WindowAnimationTransition">
    <item name="android:windowEnterAnimation">@android:anim/fade_in</item>
    <item name="android:windowExitAnimation">@android:anim/fade_out</item>
</style>
  1. Thêm phong cách này vào chủ đề ứng dụng của bạn
<style name="AppBaseTheme" parent="Theme.Material.Light.DarkActionBar">
      <item name="android:windowAnimationStyle">@style/WindowAnimationTransition</item>
</style>

Đó là nó :)


31

Đúng. Bạn có thể nói với HĐH loại chuyển đổi nào bạn muốn có cho hoạt động của mình.

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    getWindow().setWindowAnimations(ANIMATION);

    ...

}

Trong đó ANIMATION là một số nguyên đề cập đến một hình ảnh động được xây dựng trong HĐH.


Tôi có phải làm một cái gì đó khác để nó hoạt động không? getWindow (). setWindowAnimations (android.R.anim.fade_in) không dẫn đến chuyển đổi đẩy được sử dụng theo mặc định, nhưng nó cũng không phải là chuyển tiếp mờ dần. Hoạt động mới chỉ xuất hiện so với hoạt động trước đó trong thiết bị Nexus One.
hpique

1
Đó là bởi vì đây không phải là yêu cầu tài nguyên, nó yêu cầu id của hình ảnh động chuyển tiếp được tích hợp trong HĐH. developer.android.com/intl/fr/reference/android/view/NH
CaseyB

4
Có vẻ như setWindowAnimations chỉ chấp nhận tài nguyên kiểu. getWindow (). setWindowAnimations (android.R.style.Animation_Toast) là thứ gần nhất tôi tìm thấy để làm mờ dần, nhưng nó mờ dần khỏi màu đen, không phải hoạt động trước đó.
hpique

1
Nó không phải được xây dựng trong hình ảnh động trong HĐH, bạn có thể xác định một tùy chỉnh trong các giá trị.
ilija139

1
@ ilija139, bạn có chắc không? Nó nói ở đây developer.android.com/reference/android/view/ trên : "Đây phải là tài nguyên hệ thống; nó không thể là tài nguyên ứng dụng vì trình quản lý cửa sổ không có quyền truy cập vào các ứng dụng."
lapis

29

tạo res> anim> fadein.xml

<?xml version="1.0" encoding="utf-8"?>
    <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" />

tạo res> anim> fadeout.xml

<?xml version="1.0" encoding="utf-8"?>
    <alpha xmlns:android="http://schemas.android.com/apk/res/android"
       android:interpolator="@android:anim/accelerate_interpolator"
       android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="500" />

Trong res> giá trị> style.xml

<style name="Fade">
        <item name="android:windowEnterAnimation">@anim/fadein</item>
        <item name="android:windowExitAnimation">@anim/fadeout</item>
    </style>

Trong các hoạt động onCreate ()

getWindow().getAttributes().windowAnimations = R.style.Fade;

2
Tôi muốn đề nghị thêm nó vào một chủ đề để nó được áp dụng cho tất cả các hoạt động?
Peterdk

12
Những hình ảnh động này đã được xác định trong Android, chỉ cần thêm đoạn mã sau vào onPause () của tất cả các hoạt động:overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
Elad Nava

Có, chỉ muốn cho thấy rằng hình ảnh động có thể được chỉnh sửa theo ý thích của các nhà phát triển.
IceSteve


25

Tôi ghi đè lên hoạt hình mặc định của tôi. Tôi kiểm tra nó trong api 15 rằng nó hoạt động trơn tru. Đây là giải pháp mà tôi sử dụng:

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorPrimary</item>
    <item name="android:windowAnimationStyle">@style/CustomActivityAnimation</item>

</style>

<style name="CustomActivityAnimation" parent="@android:style/Animation.Activity">
    <item name="android:activityOpenEnterAnimation">@anim/slide_in_right</item>
    <item name="android:activityOpenExitAnimation">@anim/slide_out_left</item>
    <item name="android:activityCloseEnterAnimation">@anim/slide_in_left</item>
    <item name="android:activityCloseExitAnimation">@anim/slide_out_right</item>
</style>

Tạo thư mục hoạt hình trong thư mục res và sau đó tạo bốn tệp hoạt hình này:

slide_in_right.xml

<?xml version="1.0" encoding="utf-8"?>

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

slide tựa_left.xml

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

slide_in_left.xml

<?xml version="1.0" encoding="utf-8"?>

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

slide tựa_right.xml

<?xml version="1.0" encoding="utf-8"?>

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

Bạn có thể tải về dự án mẫu của tôi .

Đó là tất cả... :)


Đây phải là câu trả lời được chấp nhận. Hoạt động tốt!
EdgeDev

24

Đây là mã để thực hiện trơn tru giữa hai hoạt động.

  1. hiệu ứng mượt mà từ trái sang phải

    Tạo một tệp có tên là slide_in_right.xml và slide thừng_right.xml trong res / anim

    slide_in_right.xml

        <?xml version="1.0" encoding="utf-8"?>
        <set xmlns:android="http://schemas.android.com/apk/res/android"
            android:shareInterpolator="false" >
            <translate android:duration="5000" android:fromXDelta="100%" android:toXDelta="0%" />
            <alpha android:duration="5000" android:fromAlpha="0.0" android:toAlpha="1.0" />
        </set>

    slide tựa_right.xml

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:shareInterpolator="false" >
        <translate android:duration="5000" android:fromXDelta="0%" android:toXDelta="-100%"/>
        <alpha android:duration="5000" android:fromAlpha="1.0" android:toAlpha="0.0" />
    </set>
  2. hiệu ứng mượt mà từ phải sang trái

    Tạo một tệp có tên là animation_enter.xml và animation_leave.xml trong res / anim

    anim_enter.xml

       <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:shareInterpolator="false">
        <translate android:fromXDelta="-100%" android:toXDelta="0%"
            android:fromYDelta="0%" android:toYDelta="0%"
            android:duration="700"/>
       </set>

    anim_leave.xml

      <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:shareInterpolator="false">
        <translate
            android:fromXDelta="0%" android:toXDelta="100%"
            android:fromYDelta="0%" android:toYDelta="0%"
            android:duration="700" />
      </set>
  3. Điều hướng từ hoạt động này sang hoạt động thứ hai

       Intent intent_next=new Intent(One_Activity.this,Second_Activity.class);
       overridePendingTransition(R.anim.slide_in_right,R.anim.slide_out_right);
       startActivity(intent_next);
     finish();

    4.Trên sự kiện báo chí trở lại hoặc Điều hướng từ hoạt động thứ hai đến một Hoạt động

     Intent home_intent = new Intent(Second_Activity.this, One_Activity.class);
     overridePendingTransition(R.anim.animation_enter, R.anim.animation_leave);
     startActivity(home_intent);
     finish();

3
OverridePendingTransition phải sau startActivity trong 3.
arberg 14/1/2016

OverridePendingTransition phải sau startActivity trong 3 và 4
Tareq

Nó không hoạt động đối với tôi nếu ghi đèPendingTransition () đặt trước startActivity ()
Fernando Tan

Nên gọi overridePendingTransitionngay sau startActivity: developer.android.com/reference/android/app/áp
Midhun MP

4

Bạn không thể sử dụng overridePendingTransition trong Android 1.5. overridePendingTransistion đã đến với Android 2.0.

Nếu bạn sẽ vượt qua điều này mà không có bất kỳ lỗi nào, bạn phải biên dịch cho mục tiêu (1,5 hoặc cao hơn) bằng cách sử dụng các hình ảnh động thông thường (hoặc bạn sở hữu) hoặc bạn phải biên dịch cho mục tiêu (2.0 trở lên) bằng cách sử dụng overridePendingTransistion.

Tóm tắt: Bạn không thể sử dụng overridePendingTransistion trong Android 1.5 .

Mặc dù vậy, bạn có thể sử dụng các hình ảnh động tích hợp trong HĐH.


Đó là không đúng. Ảnh động có trong Android tốt trước 1.6 và bạn có thể sử dụng overridePendingTransistion với sự phản chiếu để vẫn nhắm mục tiêu 1.5.
hpique

Vâng, sai lầm của tôi. Cập nhật bài viết của tôi. Bạn chắc chắn có thể thực hiện hoạt hình của riêng mình và tùy chỉnh chúng theo ý muốn trong 1.5. Nhưng bạn vẫn không thể sử dụng overridePendingTransition kể từ khi nó bắt đầu xuất hiện ở cấp độ API 5.
Rèm

2

Trong các thiết bị GALAXY:

Bạn cần đảm bảo rằng bạn không tắt nó trong thiết bị bằng Cài đặt> Tùy chọn nhà phát triển:

hai muppets


ngay cả đối với các thiết bị LG :)
Ultimo_m

Tôi nghĩ vậy ,, nhưng tôi không thử
Maher Ismaail 20/07/2015

Tuyệt diệu! Tôi tìm thấy câu trả lời của bạn sau vài giờ tìm kiếm chuyển tiếp và hình ảnh động.
CoolMind

1

Sử dụng API ActivityCompat.startActivity () hoạt động> 21.

    ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(activity, transitionImage, EXTRA_IMAGE);
    ActivityCompat.startActivity(activity, intent, options.toBundle());

1

Trước khi bắt đầu ý định của bạn:

ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(AlbumListActivity.this);
startActivity(intent, options.toBundle());

Điều này mang lại Hoạt hình mặc định cho Chuyển đổi hoạt động của bạn.


0

Một số phiên bản Android hỗ trợ Activitychuyển đổi tùy chỉnh và một số phiên bản không (thiết bị cũ hơn). Nếu bạn muốn sử dụng các hiệu ứng chuyển tiếp tùy chỉnh, hãy kiểm tra xem liệu ActivityoverridePendingTransition() phương pháp, như trên các phiên bản cũ nó không.

Để biết liệu phương thức có tồn tại hay không, API phản chiếu có thể được sử dụng. Đây là mã đơn giản sẽ kiểm tra và trả về phương thức nếu nó tồn tại:

Method mOverridePendingTransition;

try {
        mOverridePendingTransition = Activity.class.getMethod(
                "overridePendingTransition", new Class[] { Integer.TYPE, Integer.TYPE } );
        /* success */
    } catch (NoSuchMethodException nsme) {
        /* failure, this version of Android doesn't have this method */
    } 

Và sau đó, chúng ta có thể áp dụng chuyển tiếp của riêng mình, tức là sử dụng phương thức này nếu nó tồn tại:

if (UIConstants.mOverridePendingTransition != null) {
               try {
                   UIConstants.mOverridePendingTransition.invoke(MainActivity.this, R.anim.activity_fade_in, R.anim.activity_fade_out);
               } catch (InvocationTargetException e) {
                   e.printStackTrace();
               } catch (IllegalAccessException e) {
                   e.printStackTrace();
               }
            }

Ở đây, như một ví dụ, các hình ảnh động mờ dần và mờ dần đơn giản đã được sử dụng để trình diễn chuyển tiếp ..


0

phóng to hoạt hình

Intent i = new Intent(getApplicationContext(), LoginActivity.class);
 overridePendingTransition(R.anim.zoom_enter, R.anim.zoom_exit);
startActivity(i);
finish();

zoom_enter

<?xml version="1.0" encoding="utf-8"?>
<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" />

zoom_exit

<alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_interpolator"
    android:fromAlpha="1.0" android:toAlpha="0.0"
    android:fillAfter="true"
    android:duration="500" />
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.