Android|Fragment和Activity页面跳转实现左进右出的过渡动画

2023.04.03 补充该功能在 Fragment 中的使用方法:

Tip:使用Activity实现的直接看下面就行,不用看这一节代码

1、如果是在同一个activity管理下的fragment中跳转直接使用以下代码:

//replace() 实现跳转替换
//setCustomAnimations() 实现跳转动画

getFragmentManager().beginTransaction()
                        .setCustomAnimations(R.anim.slide_in_from_right, R.anim.slide_out_from_left, R.anim.slide_in_from_left, R.anim.slide_out_from_right)
                        .replace(R.id.welcomeLayout, new registerFragment()) //第一个参数是activity容器,第二个参数是替换的fragment页面
                        .addToBackStack(null) //将页面加入回退栈不然会被销毁
                        .commit();

2、如果是在不同activity管理的fragment中跳转,在需要跳转的地方使用:

Intent intent = new Intent(getContext(), MainActivity.class);//写fragment的管理Activity
startActivity(intent);
getActivity().overridePendingTransition(R.anim.slide_in_from_left, R.anim.slide_out_from_right); //两个动画文件

跳转后fragment管理activity中重写 finish() 方法( onBackPressed() 方法也可以):

    @Override
    public void finish() {
        super.finish();
        overridePendingTransition(R.anim.slide_in_from_left, R.anim.slide_out_from_right); //两个动画文件
    }

至此,两种方式都可实现动画了!


以下是原文章:

实现效果

在这里插入图片描述

创建文件

res中创建anim文件夹,之后创建四个动画文件:

文件名:slide_in_from_left.xml
效果:页面从左侧向右侧进入

<?xml version="1.0" encoding="utf-8"?>
<!-- 页面从左侧向右侧进入 -->
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromXDelta="-100%"
    android:toXDelta="0"
    android:duration="2000">
</translate>

文件名:slide_in_from_right.xml
效果:页面从右侧向左侧进入

<?xml version="1.0" encoding="utf-8"?>
<!-- 页面从右侧向左侧进入 -->
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromXDelta="100%"
    android:toXDelta="0"
    android:duration="2000">
</translate>

文件名:slide_out_from_left.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:duration="2000">
</translate>

文件名:slide_out_from_right.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:duration="2000">
</translate>

调用方法:

//该方法的第一个参数是作用于第二个Activity进入的动效,第二个参数是作用于当前Activity退出的动效
overridePendingTransition(R.anim.slide_in_from_right,R.anim.slide_out_from_left);

第一个Activity页面在跳转方法后写入其方法,实现两个Activity的过渡动画:

Button bt_jump = findViewById(R.id.bt_jump);

        bt_jump.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent(MainActivity.this,TwoActivity.class);
                startActivity(intent);

                //该方法的第一个参数是作用于第二个Activity进入的动效,第二个参数是作用于当前Activity退出的动效
                overridePendingTransition(R.anim.slide_in_from_right,R.anim.slide_out_from_left);
            }
        });

第二个Activity页面需要重写按下返回键方法并写入其方法,实现两个Activity的过渡动画:

    /**
     * 重写按下返回键的方法
     */
    @Override
    public void onBackPressed() {
        super.onBackPressed();
        //该方法的第一个参数是作用于第二个Activity进入的动效,第二个参数是作用于当前Activity退出的动效
        overridePendingTransition(R.anim.slide_in_from_left,R.anim.slide_out_from_right);
    }

全部代码

第一个ActivityMainActivity.java

package com.example.activityswitch;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button bt_jump = findViewById(R.id.bt_jump);

        bt_jump.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent(MainActivity.this,TwoActivity.class);
                startActivity(intent);

                //该方法的第一个参数是作用于第二个Activity进入的动效,第二个参数是作用于当前Activity退出的动效
                overridePendingTransition(R.anim.slide_in_from_right,R.anim.slide_out_from_left);
            }
        });

    }
}

第二个ActivityTwoActivity.java

package com.example.activityswitch;

import android.os.Bundle;

import androidx.appcompat.app.AppCompatActivity;

public class TwoActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_two);
    }

    /**
     * 重写按下返回键的方法
     */
    @Override
    public void onBackPressed() {
        super.onBackPressed();
        //该方法的第一个参数是作用于第二个Activity进入的动效,第二个参数是作用于当前Activity退出的动效
        overridePendingTransition(R.anim.slide_in_from_left,R.anim.slide_out_from_right);
    }

}

结语

overridePendingTransition方法可参考此篇博客:http://t.csdn.cn/xm4Pq
onBackPressedonKeyDown方法的区别可参考此篇博客:http://t.csdn.cn/59b5r
部分内容借鉴此篇博客:http://t.csdn.cn/6ardU

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值