繁体   English   中英

如何实现从右到左的动画开始活动

[英]How to achieve right to left animation to start the activity

我正在开发一个演示应用程序,我想在应用程序启动任何activity时应用动画。 我写了下面的代码,但这是为了从左到右为活动设置动画。

left_to_right.xml

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

<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="500"/>
</set>

right_to_left.xml

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

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

我在这里开始这样的activity

startActivity(new Intent(this, LoginActivity.class));
overridePendingTransition(R.anim.left_to_right, R.anim.right_to_left);

我想实现从右到左的动画。 如何做到这一点。

提前致谢。

对动画文件进行以下修改:

输入.xml:

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

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

退出.xml:

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

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

您的第二个活动将从右向左滑动。

为了更好地理解如何处理动画的 fromXDelta 和 toXDelta 值,这里有一个非常基本的值说明:X 轴上的活动转换值

通过这种方式,您可以轻松理解为什么要为当前活动添加 android:fromXDelta="0%" 和 android:toXDelta="-100%"。 这是因为您希望它从 0% 到 -100% 的位置。

[编辑]

因此,如果您想从 ActivityA 打开 ActivityB,请执行以下操作(假设您有一个按钮):

button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            startActivity(new Intent(ActivityA.this, ActivityB.class));
            overridePendingTransition(R.anim.enter, R.anim.exit);
        }
    });

现在,如果您想拥有第一个的“向后”动画,当您离开 Activity B 时,您将需要 2 个新动画文件和 ActivityB 的 onBackPressed 方法中的一些代码,如下所示:

首先是动画文件:left_to_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="500"
        android:fromXDelta="-100%"
        android:fromYDelta="0%"
        android:toXDelta="0%"
        android:toYDelta="0%" />
</set>

right_to_left.xml:

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

在 ActivityB 中执行以下操作:

@Override
public void onBackPressed() {
    super.onBackPressed();
    overridePendingTransition(R.anim.left_to_right, R.anim.right_to_left);
}

此外,如果您启用了向上导航,则在这种情况下还必须添加动画:

您可以像这样启用 UP 导航:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getActionBar().setDisplayHomeAsUpEnabled(true);
}

在这种情况下,这也是您处理动画的方式:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    // Respond to the action bar's Up/Home button
    case android.R.id.home:
       //NavUtils.navigateUpFromSameTask(this);
       finish();
       overridePendingTransition(R.anim.left_to_right, R.anim.right_to_left);
       return true;
    }
    return super.onOptionsItemSelected(item);
}

另请注意,即使您的代码没问题,您的手机也可能关闭了动画。 要打开然后执行以下操作:

  1. 打开设置并转到开发人员选项
  2. 确保它已启用(通过滑动右上角的切换按钮)
  3. 向下滚动并在“绘图”下,一一点击这些选项:Windows 动画比例、过渡动画比例和 Animator 持续时间比例
  4. 选择“动画比例 1x”

这有帮助吗?

应在“目标”活动中调用overridePendingTransition 例如:从 Activity A -> B 开始,您可以将overridePendingTransition调用放在 Activity B 的onCreate中。

请记住,如果用户在系统级别禁用了动画,则无法强制显示动画。

编辑:

一个示例如下所示:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    overridePendingTransition(R.anim.enter, R.anim.exit);
}

这对我来说是完美的代码 Slideinleft

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

向右滑动

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

活动中

Intent intent = new Intent(getApplicationContext(),termcondionactivity.class);
Bundle bndlAnimation = ActivityOptions.makeCustomAnimation(getApplicationContext(), R.anim.slideinleft, R.anim.slideinright).toBundle();

startActivity(intent, bndlAnimation);

试试这个代码,它对我有用

从右向左滑动

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

从左向右滑动

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

要在整个应用程序上应用活动过渡动画,我们需要遵循几个步骤。

步骤 1. 创建四个动画资源。 (slide_in_left、slide_in_right、slide_out_left 和 slide_out_right)

资源文件:slide_in_left.xml

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

资源文件:slide_in_right.xml

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

资源文件:slide_out_left.xml

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

资源文件:slide_out_right.xml

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

步骤 2. 创建自定义样式并使用动画资源。

<style name="MyCustomActivityAnimation" 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>

步骤 3. 将样式应用到应用程序的主题。

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

步骤 4. 在 Manifest 中将主题应用于您的应用程序。

<application
   ....
    android:theme="@style/AppTheme"
    >
    ....
 </application>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM